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

چرا باید از ترمینال بریم سراغ فایل‌ها؟

به دلایل مختلفی ممکنه بخوایم از ترمینال به مدیریت فایل‌ها بپردازیم

  • گاهی اوقات فایل منیجر در دسترس نیست؛ مثلا وقتی با SSH به یه دسکتاپ یا سرور وصل می‌شیم یا وقتی برنامه فایل منیجر رو دسکتاپ نداریم یا اینکه مشکلی داره!
  • اجرای بعضی دستورات در فایل منیجر ممکن نیست یا گاهی وقت‌گیره (مثلا دریافت لیست کامل محتویات دایرکتوری و ساب‌دایرکتوری‌ها یا جستجو در فایل‌ها)

توضیحات این صفحه به هیچ عنوان کامل نیست :) من فقط نکاتی که به نظرم کاربردی بودن رو اینجا گفتم.

۱- نمایش فهرست فایل‌ها و دایرکتوری‌ها در ترمینال

قاعدتا اولین دستور ls هست برای فهرست کردن فایل‌های موجود. برای نمایش توضیحات این دستور، ls --help رو وارد می‌کنیم اما آرگیومنت‌های پرکاربرد این‌ها هستن:

آرگیومنت توضیحات
 -l نمایش هر فایل در یک خط با توضیحات اضافه شامل نوع فایل، دسترسی‌ها، اندازه فایل‌ها و زمان آخرین ویرایش
 -F نمایش / در انتهای نام دایرکتوری‌ها
 -S مرتب سازی بر اساس اندازه فایل از بزرگترین به کوچک‌ترین
 -r برعکس کردن ترتیب فایل‌ها
 -lh نمایش سایز فایل‌ها در فرمت قابل خوانش (مگابایت، گیگابایت و...)
 -a نمایش فایل‌ها و دایرکتوری‌های مخفی (که نامشان با . شروع می‌شود)
 -R نمایش فایل‌های موجود در ساب‌دایرکتوری‌ها

معمولا دستور زیر یه خروجی مناسب و کاربردی بهم می‌ده:

ls -lha

اما بر فرض محال، در شرایط خاص اگه عجله داشته باشم و بخوام یه لیست کامل از تمام محتویات یه دایرکتوری خاص دربیارم این دستور رو اجرا می‌کنم:

ls -lharFRS > ~/list.txt

۲- تغییر دایرکتوری در ترمینال

برای تغییر دایرکتوری از cd استفاده می‌کنیم :) توضیحات خاصی نداره!

  • cd به تنهایی ما رو به user home directory منتقل می‌کنه
  • cd ~ هم باز ما رو به user home directory هدایت می‌کنه اما اگه بعد از ~ یه یوزرنیم وارد کنیم به home directory مربوط به همون کاربر منتقل می‌شیم
  • cd - ما رو به آخرین دایرکتوری برمی‌گردونه! مثلا اگه در  /home/usr/Downloads باشیم بعد دستور cd ~/Music رو بزنیم به /home/usr/Music منتقل می‌شیم و حالا با cd - به /home/usr/Downloads برمی‌گردیم.

۳- جستجو در فایل‌ها در ترمینال

در استفاده از این دستور مراقب باشید، مثلا find ~ -delete می‌تونه همه‌ی فایل‌های شخصی رو حذف کنه!

کلیت دستور find به این شکله:

find [options] [path] [expression]

که در options تعریف می‌کنیم چه رفتاری با پیوندهای نمادین (symbolic links) داشته باشه؟ بعد در path تعریف می‌کنیم که جستجو رو باید از کجا شروع کنه؟ و نهایتا در expression تعریف می‌کنیم که دنبال چه چیزی بگرده و باهاش چه کار کنه؟

البته این کلیت دستور هست و این بخش‌ها الزامی نیستند، حالا توضیحات تفصیلی‌تر:

در بخش options

در این بخش رفتار مطلوب در مقابل symbolic links رو تعریف می‌کنیم.

 -P حالت پیش‌فرض: پیوندهای نمادین را دنبال نکرده و اطلاعات مربوط به خودِ پیوند مرجع می‌شود.
 -L همواره پیوند نمادین را دنبال کرده و هم‌چنین اطلاعات مربوط به مقصد پیوند مورد ارجاع قرار گیرد.
 -H پیوند نمادین را دنبال نمی‌کند اما برای دستورات CLI، اطلاعات مقصد پیوند مرجع خواهند بود.
 -D چاپ موارد مربوط به دیباگ برنامه‌ی find

در بخش expression

عمده دستکاری‌های ما در این بخش هستند! اینجا تعریف می‌کنیم دنبال چه فایلی می‌گردیم یا چه بلایی می‌خوایم سرش بیاریم :)

نکته: هر کجا از عدد در دستور استفاده کنیم می‌تونیم + یا - قبل از عدد بیاریم که به معنای بیش‌تر یا کم‌تر از اون عدد خواهد بود.

جستجو بر اساس نام یا پسوند فایل در ترمینال

 -name []

جستجو بر اساس نام یا پسوند با حساسیت به حروف کوچک و بزرگ

 -iname []

جستجو بر اساس نام یا پسوند بدون حساسیت به حروف کوچک و بزرگ
find ~ -name name.txt
find ~ -iname name.txt
find ./ -name "*name*"
find ./ -iname "*name*"
find ./ -name "*.ext"
find ./ -iname "*.ext"

جستجو بر اساس سایز فایل در ترمینال

 -size n

جستجو بر اساس سایز

ما می‌تونیم برای سایز واحد تعریف کنیم: c برای بایت؛ k برای کیلوبایت؛ M برای مگابایت و G برای گیگابایت.

تمام فایل‌هایی که دقیقا ۱ گیگابایت حجم دارند
find -type f -size 1G
فایل‌هایی با پسوند txt که بیش از ۵۰ کیلوبایت حجم دارند
find -type f -name '*.txt' -size +50k
فایل‌هایی با حجم بین ۵ تا ۱۵ مگابایت در دانلودها
find ~/Downloads -type f -size +5M -size -15M

جستجو و حذف فایل‌ها و دایرکتوری‌ها در ترمینال

 -delete

حذف فایل‌های یافت شده!

دقت کنید که چون find از چپ به راست اجرا می‌شه -delete رو همیشه در انتها قرار بدین.

حذف فایل‌ها و دایرکتوری‌های خالی
find ~ -empty -delete
حذف تمام فایل‌ها در پوشه دانلودها و نه ساب‌دایرکتوری‌ها
find ~/Downloads -type f -maxdepth 0 -delete
حذف هر فایلی با نام test.txt در دانلودها و ساب‌دایرکتوری‌ها
find ~/Downloads name test.txt -delete

جستجوی فایل و اجرای دستور در ترمینال

ما می‌تونیم از find بخوایم هر دستوری (خارج از تعریفات خود برنامه) روی فایل‌های یافت شده اجرا کنه:

 -exec command {} \; اجرای command روی فایل‌ها و دایرکتوری‌های یافت شده بدون کسب اجازه
 -ok command {} \; اجرای command روی فایل‌ها و دایرکتوری‌های یافت شده با کسب اجازه

پیشنهاد می‌کنم همیشه قبل از اجرای هر دستوری روی فایل‌ها اول یه بار دستور ls رو اجرا کنید تا لیستی از فایل‌هایی که قراره تغییر کنن ببینید و احتمال اشتباه کم‌تر بشه:

find -exec ls {} \;

چند مثال تکمیلی:

تغییر مجوز دسترسی به تمام فایل‌های .php در دایرکتوری /var/www و ساب‌دایرکتوری‌ها:

find /var/www -iname '*.php' -exec chmod 664 {} \;

جابجا کردن تمام فایل‌های .PDF از دایرکتوری دانلودها (و نه ساب‌دایرکتوری‌ها) به /home/PDFs:

find ~/Downloads -iname '*.pdf' -exec mv {} /home/PDFs/ \;

حذف فایل‌های خالی با دستور rm:

find ~ -type f -empty -ok rm {} \;

حذف فایل‌های با حجم بالاتر از ۲ گیگابایت با کسب اجازه:

find ~ -type f -size +2G -ok rm{} \;

یافتن تمام فایل‌ها به جز فایل‌های .png در دانلودها و ذخیره سازی نتیجه در یک فایل txt:

find ~/Downloads -type f -not -iname '*.png' > ~/myfile.txt
find ~/Downloads -type f -not -iname '*.png' -fls ~/myfile.txt

۴- باز کردن فایل از ترمینال

برای باز کردن یک فایل خاص در ترمینال از دستور xdg-open استفاده می‌کنیم؛ این دستور فایل رو با برنامه پیش‌فرض باز می‌کنه، در صورتی که برنامه پیش‌فرض تعریف نشده باشه ارور می‌ده و در صورتی که به جای آدرس فایل، آدرس وبسایت وارد کنیم، اونو با مرورگر پیش‌فرض باز می‌کنه.

xdg-open '~/Downloads/file.txt' => text editor

xdg-open 'https://matinu.ir' => Browser