تعدادی روش اختیاری وجود دارد، اکثر آنها اختصاصی سیستم هستند. همچنین دقیقاً بستگی به آن دارند که چرا اطلاعات را میخواهید، در اکثر حالتها، روشهای دیگری برای انجام هدف واقعی شما وجود دارد. شما نیاز ندارید خروجی ls را تفکیک نمایید در صورتیکه برای اجتناب از انجام آن، یک روش امکان پذیر موجود باشد.
بسیاری از موقعیتهایی که در آنها شاید شما جویای مجوزها بشوید -- از قبیل من میخواهم هر فایلی که بیت setuid زیرنویس 1 آن تنظیم شده را پیدا کنم -- میتوانند با فرمان find(1) مدیریت بشوند.
برای برخی پرسشها، از قبیل میخواهم مطمئن شوم این فایل مجوز 0644 دارد، حقیقتاً شما نیاز به بررسی آن که مجوزها کدامند، ندارید. شما میتوانید فقط از chmod 0644 myfile استفاده کنید و آنها را به طور مستقیم تنظیم کنید. و اگر واقعا به جای مجبور کردن آنها به مجوز مورد نظر، نیاز به بررسی مجوزها دارید، آنوقت میتوانید از گزینه -perm فرمان find استفاده کنید.
اگر میخواهید ببینید آیا میتوانید فایلی را بخوانید، بنویسید، یا اجرا کنید، test -r , -x , -w موجود میباشند.
اگر میخواهید ببینید آیا اندازه یک فایل صفر است یا خیر، نیازی به خواندن اندازه فایل در یک متغیر ندارید. به جای آن میتوانید فقط test -s را به کار ببرید.
اگر میخواهید زمان ویرایش یک فایل را به دیگری کپی کنید، میتوانید touch -r را به کار ببرید. فرمان chown در بعضی سیستمهای گنو-لینوکس دارای گزینه --reference میباشد که به همان طریق کار میکند، به شما اجازه میدهد مالک، و گروه را از یک فایل به دیگری کپی نمایید.
اگر نیازهای شما مطابق با یکی از آنها نیست، و واقعاً احساس میکنید باید فوق دادههای یک فایل را استخراج و در یک متغیر قرار بدهید، آنوقت ما میتوانیم چند جایگزین را در نظر بگیریم:
در سیستمهای گنو-لینوکس، *BSD و احتمالاً دیگران، فرمانی به نام stat(1) وجود دارد. در سیستمهای قدیمیتر گنو-لینوکس، این فرمان گزینهای نمیگیرد -- فقط نام فایل -- و شما باید خروجی آن را تفکیک نمایید.
$ stat / File: "/" Size: 1024 Filetype: Directory Mode: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Device: 8,0 Inode: 2 Links: 25 Access: Wed Oct 17 14:58:02 2007(00000.00:00:01) Modify: Wed Feb 28 15:42:14 2007(00230.22:15:49) Change: Wed Feb 28 15:42:14 2007(00230.22:15:49)
در این وضعیت، شخص میتوانست 0755 را از سطر Mode:، با استفاده از awk یا فرمانهای مشابهی استخراج کند.
در سیستمهای گنو-لینوکس جدیدتر:
$ stat -c %a / 755
به طور آشکاری برای تجزیه خیلی آسانتر است. ترکیب دستوری با BSDها (NetBSD و OpenBSD و FreeBSD و مشتقات آنها مانند Apple OS/X)، متفاوت است و لازم است شما مجوزها را از روی mode استخراج کنید:
mode=$(stat -f %p -- "$filename") perm=$(printf %o "$((mode & 07777))")
perl -e 'printf "%o\n", 07777 & (stat $ARGV[0])[2]' "$filename"
این کد همان رشته اُکتال مثال stat -c %a را باز میگرداند، اما خیلی بیشتر قابل حمل است. (و آهستهتر).
فرمان find گنو دارای یک گزینه -printf است که میتواند هر فوقدادهای از یک فایل را به خروجی ارسال کند:
find "$filename" -prune -printf '%m\n'فرمان find بیش از یک دهه قدیمیتر از stat گنو است و همچنین میتواند فوقداده چندین فایل در یک دایرکتوری را ارائه کند. به هر حال مراقب باشید که برای فایلی به نام -print و ( و !... یا هر گزاره دیگر find، لازم است اطمینان حاصل کنید که نام فایل به صورت ./-print, ./(, ! یا سایر مسیرهای نسبی یا مطلقِ فایل عبور داده شود، که find سر در گم نگردد.
اگر bash شما با loadable builtin support کامپایل گردیده، میتوانید یک فایل finfo داخلی بسازید(در شاخه examples/loadables/ دایرکتوری فرعی درخت فایلهای منبع bash خودتان، تایپ کنید make)، آنرا enable کنید، و سپس کد زیر را به کار ببرید:
$ finfo -o .bashrc 644
آگاه باشید که finfo.c توزیع شده با bash تا نگارش 4.0 حداقل شامل یک باگ است(درگزینه -s )، بنابراین آشکارا کد زیاد بررسی نگردیده است. اکثر بستههای از پیش کامپایل شده bash شامل مثالهای کامپایل شده نیستند، از این جهت شاید این حایگزین برای اکثر کاربران دشوار باشد.
پرسش و پاسخ 87 (آخرین ویرایش 2013-07-25 13:37:13 توسط StephaneChazelas)