file - تعیین نوع فایل‌ها

file - از این دستور برای تعیین نوع فایل ها استفاده می‌شود.

شکل کلی دستور:

$ file [options] [file]

این دستور باتوجه به فایل یا لیست فایل‌هایی که با آن داده می‌شود براساس آزمون‌هایی که روی آن انجام می‌دهد، نوع آن‌ها را تشخیص داده و آن‌ها را دسته‌بندی می‌کندو در انتها در خروجی استاندارد آن‌ها را چاپ می‌کند. فایل‌ها می‌تواند: فایل منظم، دایرکتوری، بلوک خاص، کاراکتر ویژه، لینک نمادین، FIFO و سوکت‌ها باشد.

  • اگر آن یک فایل منظم به طول صفر بود، آن به عنوان یک فایل خالی شناخته می‌شود.
  • اگر آن یک لینک نمادین بود، نوع فایل، لینکی است که لینک نمادین به آن اشاره می‌کند.
  • اگر فایل به صورت اسکی ظاهر شود، دستور فایل ۱۰۲۴ بایت اول را بررسی می‌کند و نوع فایل را مشخص می‌کند.
  • اگر فایل به صورت اسکی ظاهر نشود، در این صورت دستور فایل تلاش بیشتری خواهد داشت به این صورت که برای تشخیص  یک فایل، داده‌ای دودویی از یک فایل نوشتاری که شامل کاراکترهای طولانی است بهره خواهد گرفت.
  • اگر پارامتر فایل (به شکل کلی دستور دقت کنید) یک فایل اجرایی باشد و شماره نسخه‌ی آن بزرگ‌تر از صفر باشد، دستور فایل شماره جنس آن را نمایش خواهد داد.

مثال:

$ file /home/name/Desktop/test
/home/name/Desktop/test: empty

در مثال بالا یک فایل متنی ساده ایجاد کردیم که خالی از متن است. همین‌طور که مشاهده می‌کنید دستور فایل بدون نیاز به بازکردن فایل به ما خالی بودن فایل را نشان می‌دهد. حال در مثال بعدی، نوشته ای را وارد فایل خالی کرده و آن‌را ذخیره می‌کنیم به مثال بعدی توجه کنید.

مثال:

$ file /home/name/Desktop/test
/home/name/Desktop/test: ASCII text

همین‌طور که در خروجی مشاهده می‌کنید، خروجی ما را از وجود فایل نوشتاری آگاه می‌سازد.

همچین می‌توان از علامت ستاره (*) برای مشخص کردن محتویات یک پوشه یا دایرکتوری و همچنین برای تعیین نوع خاصی از فرمت استفاده کرد.

مثال:

$ cd /tmp
/tmp$ file *
at-spi2:                              sticky directory
keyring-deL6gn:                       directory
pulse-2L9K88eMlGn7:                   directory
pulse-gkyBG6xgPWaw:                   directory
pulse-PKdhtXMmr18n:                   directory
qtsingleapp-flareg-bcdb-3e8:          socket
qtsingleapp-flareg-bcdb-3e8-lockfile: empty
sni-qt_flareget_2574-9GG5Vu:          directory
ssh-VtapSWWs1597:                     directory
unity_support_test.0:                 empty

در مثال زیر می‌خواهم از تمام فرمت هایی که در مسیر proc وجود دارد و با so. تمام می شود آگاه شوم پس:

مثال:

$ cd /lib
/lib$ file *.so
klibc-LZ1cv1NoEVO2ugnvqTw3e4qPc8Y.so: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped
libproc-3.2.8.so:                     ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked,
BuildID[sha1]=0xd27f9551a532c7702e71c209f3b47234259baebd, stripped

نکته: در بسیاری از پیاده‌سازی‌ها، دستور فایل از یک پایگاه داده برای کاوش بایت‌های پایه‌ای استفاده می‌کند که پایگاه داده در یک فایلی به نام فایل جادویی که معمولاً در مکان‌های /etc/magic, /usr/share/file/magic  قرار دارد، اجرا می‌شود.

گزینه‌های اختیاری:

F-: همین‌طور که در مثال های قبل مشاهده کردید، قسمت نام فایل و توضیحات با علامت :جدا شده است برای تغییر آن می‌توانید از گزینه‌ی اختیاری زیر استفاده کنید:

$ cd /lib
/lib$ file -F "#" *.so
klibc-LZ1cv1NoEVO2ugnvqTw3e4qPc8Y.so# ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped
libproc-3.2.8.so#                     ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked,
BuildID[sha1]=0xd27f9551a532c7702e71c209f3b47234259baebd, stripped

نکته: شاید از گزینه‌ی اختیاری بالا سریع رد شوید! ولی نه! از این گزینه اختیاری در اسکریپت‌نویسی‌ها بسیار استفاده خواهید کرد. برای مثال وقتی که شما از عبارات منظم بخواهید بهره بگیرید و بخواهید نقاط جدا کننده را در دستورات یکی در نظر بگیرید یا...

-: از این گزینه زمانی بهره خواهید گرفته که بخواهید مقدار را از ورودی استاندارد بگیرید و دستور فایل نوع آن را مشخص کند.

$ file -

www.30li.ir
/dev/stdin: ASCII text

i-: به‌صورت پیش فرض خروجی به صورتی است که قابل خواندن توسط انسان باشد، این می‌تواند به نوع «Mime» تغییر کند:

/lib$ file -i *.so
klibc-LZ1cv1NoEVO2ugnvqTw3e4qPc8Y.so: application/x-executable; charset=binary
libproc-3.2.8.so:                     application/x-sharedlib; charset=binary

b-: خروجی را به صورت خلاصه کرده و نام فایل ها را نشان نمی‌دهد:

/lib$ file -b *.so
ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped
ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked,
BuildID[sha1]=0xd27f9551a532c7702e71c209f3b47234259baebd, stripped