هر فایل در سیستمعاملهای یونیکسمبنا، علاوه بر محتوای خود، دارای فراداده (Metadata) است؛ اطلاعاتی دربارهی خود فایل که شامل نوع فایل، اندازه، زمانها (تاریخ ایجاد، تغییر و دسترسی)، مجوزها، مالکیت و اطلاعات دیگر میشود. ابزارهای file و stat دو دستور اصلی برای مشاهده و تحلیل این فراداده هستند.
file
دستور file برای تشخیص نوع یک فایل استفاده میشود. برخلاف پسوند فایل (مانند .txt، .jpg یا .pdf) که ممکن است گمراهکننده باشد، file با بررسی محتوای واقعی فایل (معمولاً با خواندن چند بایت اولیه و مقایسه با پایگاهدادهای از الگوهای شناختهشده) نوع دقیق آن را تشخیص میدهد. این دستور برای شناسایی فایلهای باینری، اسکریپتها، فایلهای فشرده، تصاویر و انواع دیگر بسیار مفید است.
ساختار کلی:
file [option] [file...]
گزینههای اصلی file
| گزینه | توضیح | مثال |
|---|---|---|
-b | (Brief) خروجی مختصر - فقط نوع فایل را نمایش بده، بدون نام فایل. | file -b myfile.txt |
-i | (MIME) نمایش نوع MIME فایل (مانند text/plain، image/png). | file -i image.png |
-z | بررسی محتوای فایلهای فشرده (مانند .gz، .zip). | file -z archive.zip |
-L | دنبال کردن لینکهای سمبلیک (Symbolic Links) و نمایش نوع فایل مقصد. | file -L link.txt |
-s | بررسی فایلهای بلوکی یا کاراکتری ویژه (مانند دستگاهها - نیاز به sudo). | sudo file -s /dev/sda |
-f namefile | خواندن لیست فایلها از یک فایل و بررسی همهی آنها. | file -f list.txt |
مثالهای عملی
-
تشخیص نوع یک فایل ساده:
file myfile.txtخروجی:
myfile.txt: ASCII text
-
تشخیص نوع یک تصویر:
file image.jpgخروجی:
image.jpg: JPEG image data, JFIF standard 1.01
-
تشخیص نوع یک فایل باینری (اجرایی):
file /bin/lsخروجی:
/bin/ls: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked
-
تشخیص نوع یک اسکریپت پایتون:
file script.pyخروجی:
script.py: Python script, ASCII text executable
-
نمایش خروجی مختصر (بدون نام فایل):
file -b script.py
خروجی:
Python script, ASCII text executable
-
نمایش نوع MIME فایل (برای کاربردهای وب):
file -i image.png
خروجی:
image.png: image/png; charset=binary
-
بررسی یک فایل فشرده و نمایش محتوای واقعی آن (
-z):file -z archive.gz
خروجی:
archive.gz: gzip compressed data, from FAT filesystem (MS-DOS), original size 1024
-
بررسی یک لینک سمبلیک (
-L):file -L link_to_file
اگر
link_to_fileبهmyfile.txtاشاره کند، خروجی مانندmyfile.txt: ASCII textخواهد بود.
stat
دستور stat اطلاعات بسیار دقیق و جامعی دربارهی فراداده (Metadata) کامل یک فایل یا دایرکتوری نمایش میدهد. این اطلاعات شامل اندازه، نوع، مجوزها، مالک، گروه، و سه زمان مهم مرتبط با فایل است. stat برای عیبیابی، بررسی تغییرات فایل و دریافت اطلاعات دقیق از وضعیت یک فایل بسیار کاربرد دارد.
ساختار کلی:
stat [option] [file...]
خروجی استاندارد stat
یک خروجی نمونه از stat:
stat myfile.txt
خروجی:
File: myfile.txt Size: 1024 Blocks: 8 IO Block: 4096 regular file Device: 802h/2050d Inode: 123456 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user) Access: 2024-07-29 10:30:15.123456789 +0330 Modify: 2024-07-29 10:15:45.987654321 +0330 Change: 2024-07-29 10:16:20.112233445 +0330 Birth: -
بخشهای اصلی خروجی stat
| فیلد | توضیح |
|---|---|
| File | نام فایل. |
| Size | اندازهی فایل بر حسب بایت. |
| Blocks | تعداد بلوکهای ۵۱۲ بایتی اشغالشده در دیسک. |
| IO Block | اندازهی بلوک ورودی/خروجی (معمولاً ۴۰۹۶ بایت). |
| Device | شناسهی دستگاه (بهصورت هگزادسیمال/دسیمال). |
| Inode | شمارهی Inode فایل (شناسهی یکتا در سیستم فایل). |
| Links | تعداد هارد لینکهای اشارهکننده به این فایل. |
| Access | مجوزهای دسترسی (بهصورت عددی و سمبلیک). |
| Uid | شناسهی کاربر مالک (نام و شناسهی عددی). |
| Gid | شناسهی گروه مالک (نام و شناسهی عددی). |
| Access | زمان آخرین دسترسی (Access Time - atime): زمانی که فایل آخرین بار خوانده شده است. |
| Modify | زمان آخرین تغییر محتوا (Modification Time - mtime): زمانی که محتوای فایل آخرین بار تغییر کرده است. |
| Change | زمان آخرین تغییر وضعیت (Change Time - ctime): زمانی که فرادادهی فایل (مانند مجوزها یا مالکیت) آخرین بار تغییر کرده است. |
| Birth | زمان ایجاد فایل (Birth Time) - در برخی سیستمهای فایل مانند ext4 پشتیبانی میشود. |
گزینههای اصلی stat
| گزینه | توضیح | مثال |
|---|---|---|
-c, --format=FORMAT | نمایش خروجی با فرمت دلخواه (با استفاده از مشخصههای قالببندی). | stat -c "%n %s" myfile.txt |
-f, --file-system | نمایش اطلاعات مربوط به سیستم فایل (File System) بهجای خود فایل. | stat -f / |
-L, --dereference | دنبال کردن لینکهای سمبلیک و نمایش اطلاعات فایل مقصد. | stat -L link.txt |
مشخصههای قالببندی (Format Specifiers)
برخی از پرکاربردترین مشخصههای قالببندی در stat -c:
| مشخصه | توضیح |
|---|---|
%n | نام فایل. |
%s | اندازهی فایل بر حسب بایت. |
%a | مجوزها بهصورت عددی (مثلاً 644). |
%A | مجوزها بهصورت سمبلیک (مانند -rw-r--r--). |
%u | شناسهی کاربر مالک (UID). |
%U | نام کاربر مالک. |
%g | شناسهی گروه مالک (GID). |
%G | نام گروه مالک. |
%x | زمان آخرین دسترسی (Access Time) بهصورت قابل خواندن. |
%y | زمان آخرین تغییر محتوا (Modification Time) بهصورت قابل خواندن. |
%z | زمان آخرین تغییر وضعیت (Change Time) بهصورت قابل خواندن. |
%X | زمان آخرین دسترسی بهصورت Timestamp (ثانیه از ۱۹۷۰). |
%Y | زمان آخرین تغییر محتوا بهصورت Timestamp. |
%Z | زمان آخرین تغییر وضعیت بهصورت Timestamp. |
مثالهای عملی stat
-
نمایش اطلاعات کامل یک فایل:
stat myfile.txt -
نمایش فقط اندازه و نام فایل:
stat -c "%n: %s bytes" myfile.txt
خروجی:
myfile.txt: 1024 bytes -
نمایش مجوزها بهصورت عددی و سمبلیک:
stat -c "%a %A" myfile.txt
خروجی:
644 -rw-r--r-- -
نمایش زمان آخرین تغییر (Modification Time):
stat -c "%y" myfile.txt
-
نمایش اطلاعات سیستم فایل:
stat -f /
خروجی نمونه:
File: "/" ID: aabbccdd12345678 Namelen: 255 Type: ext2/ext3 Block size: 4096 Fundamental block size: 4096 Blocks: Total: 244140000 Free: 100000000 Available: 95000000 Inodes: Total: 61000000 Free: 58000000 -
نمایش فقط زمان تغییر محتوا بهصورت Timestamp:
stat -c "%Y" myfile.txt
(این مقدار برای مقایسههای عددی بسیار مفید است.)
-
مقایسهی زمان دو فایل در یک اسکریپت:
if [ $(stat -c "%Y" file1.txt) -gt $(stat -c "%Y" file2.txt) ]; then echo "file1.txt is newer than file2.txt" fi
مقایسهی file و stat
| ویژگی | file | stat |
|---|---|---|
| کاربرد اصلی | تشخیص نوع فایل (بر اساس محتوا). | نمایش فراداده دقیق فایل. |
| اطلاعات ارائهشده | نوع فایل (متن، تصویر، باینری، فشرده و ...). | اندازه، مجوزها، مالکیت، زمانها، Inode و ... |
| مبنای تشخیص | محتوای فایل (Magic Bytes). | فرادادهی ذخیرهشده در سیستم فایل. |
| کاربرد در اسکریپتنویسی | برای تصمیمگیری بر اساس نوع فایل. | برای گرفتن زمان تغییر، اندازه، مجوزها و ... |
خلاصه و نکات کلیدی
-
fileبرای فهمیدن اینکه «این فایل چیست؟» استفاده میشود و بر اساس محتوای فایل عمل میکند. این دستور بسیار مفید است زمانی که با فایلهایی با پسوندهای نامشخص یا اشتباه مواجه میشوید. -
statبرای دسترسی به تمام فرادادههای فایل استفاده میشود. این دستور اطلاعات دقیقی دربارهی اندازه، مالکیت، مجوزها، و زمانهای مختلف (دسترسی، تغییر محتوا و تغییر وضعیت) ارائه میدهد. برای عیبیابی و اسکریپتنویسی بسیار مفید است. -
تفاوت زمانها در
stat:-
Access Time (atime): هر بار که فایل خوانده میشود (مثلاً با
cat) بهروز میشود. -
Modification Time (mtime): هر بار که محتوای فایل تغییر میکند (مثلاً با ویرایشگر متن) بهروز میشود.
-
Change Time (ctime): هر بار که فرادادهی فایل تغییر میکند (مثلاً با
chmodیاchown) بهروز میشود.
-