در پایان این آموزش میدانید چگونه یک فایل، یک پوشه خالی، یک درخت کامل پوشهها و فایلهایی را که بر اساس نام یا قدمت فیلتر شدهاند حذف کنید، آن هم با بررسی هدف پیش از هر اقدام. در لینوکس، در خط فرمان سطل زباله وجود ندارد: حذف قطعی است. بنابراین روش کار به اندازه خود دستور اهمیت دارد.
پیشنیازها
- دسترسی shell به یک ماشین لینوکس (محلی یا SSH)، برای مثال یک VPS لینوکس
- کاربری با دسترسی نوشتن روی پوشه موردنظر (یا
sudo) - یک بکاپ اخیر از هر چیز مهم
بررسی هدف پیش از حذف
به پوشه درست بروید و محتوایش را فهرست کنید. این کار دو ثانیه طول میکشد و از بیشتر حوادث جلوگیری میکند.
Bashpwd ls -la
برای یک الگو (پسوند، پیشوند)، ابتدا نمایش دهید چه چیزهایی را شامل میشود. دستور rm دقیقاً از همین فهرست استفاده خواهد کرد.
Bashls -d *.log
حذف یک فایل
دستور پایه rm است.
Bashrm report.txt
گزینه -i را اضافه کنید تا تأیید بخواهد، و -v را تا آنچه حذف میکند نمایش دهد.
Bashrm -iv report.txt
سپس با ls report.txt کنترل کنید: پیام «No such file or directory» حذف را تأیید میکند.
حذف چند فایل
وایلدکاردهای shell امکان هدفگیری یک دسته فایل را میدهند. ابتدا با ls فهرست کنید، سپس حذف کنید.
Bashrm -v *.tmp rm -v photo_{01..05}.jpg
از یک وایلدکارد تنها مانند rm * در پوشهای که از آن مطمئن نیستید خودداری کنید. اگر نام یک فایل با خط تیره شروع میشود، از -- برای نشان دادن پایان گزینهها استفاده کنید:
Bashrm -- -strange-file.txt
حذف یک پوشه خالی
rmdir فقط پوشههای خالی را حذف میکند. این عمدی است: بهعنوان حفاظ ایمنی عمل میکند.
Bashrmdir old_folder
برای حذف پوشههای والدی که خالی شدهاند:
Bashrmdir -p project/cache/tmp
حذف یک پوشه و تمام محتوای آن
اینجا گزینه بازگشتی -r لازم است. ابتدا تخمین بزنید چه چیزی را از دست میدهید.
Bashdu -sh old_project find old_project -type f | wc -l
سپس با تأیید حذف کنید:
Bashrm -ri old_project
روی هزاران فایل، تأیید گرفتن عملی نیست. گزینه -f آن را غیرفعال میکند:
Bashrm -rf old_project
هرگز یک متغیر بررسینشده را در این دستور قرار ندهید. با rm -rf "$DIR"/، اگر $DIR خالی باشد، ریشه سیستم را هدف گرفتهاید. در یک اسکریپت، set -u را اضافه کنید یا از "${DIR:?}" استفاده کنید که اگر متغیر خالی باشد اجرا را متوقف میکند.
حذف فایلها بر اساس قدمت
find بر اساس معیارهای دقیق (نام، نوع، سن، اندازه) فیلتر میکند. اصل کار: ابتدا بدون هیچ اقدامی اجرا کنید، سپس -delete را اضافه کنید.
Bashfind /var/log/myapp -type f -name "*.log" -mtime +30
اگر فهرست با آنچه انتظار دارید مطابقت دارد:
Bashfind /var/log/myapp -type f -name "*.log" -mtime +30 -delete
-mtime +30 فایلهایی را مشخص میکند که بیش از 30 روز پیش تغییر کردهاند. -delete را در آخر قرار دهید: find شرطها را از چپ به راست ارزیابی میکند و یک -delete که زودتر قرار گرفته باشد همهچیز را حذف میکند.
پاک کردن امنتر یک فایل حساس
rm ورودی فایل را حذف میکند، نه لزوماً دادههای روی دیسک را. shred پیش از حذف، محتوا را بازنویسی میکند.
Bashshred -u -v secret.key
این روش روی SSDها، سیستمفایلهای ژورنالی یا حجمهای دارای snapshot، که ممکن است دادههای قدیمی باقی بمانند، محدودیت دارد. برای دادههای واقعاً حساس، رمزگذاری دیسک از همان ابتدا راهحل قابل اعتماد باقی میماند.
رفع خطاهای رایج
Permission denied
شما دسترسی نوشتن روی پوشه والد ندارید (این پوشه است که حذف را کنترل میکند، نه فایل). با ls -ld DIRECTORY بررسی کنید، سپس اگر مجاز است از sudo استفاده کنید:
Bashsudo rm -v /path/to/file
Operation not permitted، حتی با sudo
فایل احتمالاً ویژگی تغییرناپذیر (immutable) دارد. آن را بررسی کنید، ویژگی را بردارید، سپس حذف کنید.
Bashlsattr file.txt sudo chattr -i file.txt sudo rm file.txt
Argument list too long
وایلدکارد تعداد آرگومانهایی بیشتر از حد پذیرش سیستم تولید کرده است. از find استفاده کنید که فایلها را یکییکی پردازش میکند:
Bashfind . -maxdepth 1 -type f -name "*.tmp" -delete
Directory not empty یا Device or resource busy
با rmdir، پیام اول طبیعی است: پوشه شامل فایلهایی است، از جمله فایلهای مخفی (ls -A). اگر یک نقطه اتصال (mount) یا یک پردازش از آن استفاده میکند، آن را با lsof +D DIRECTORY یا findmnt شناسایی کنید، سپس پیش از تلاش دوباره آزادش کنید.
برای تمرین بدون خطر، یک نمونه یکبارمصرف مناسب است: روی یک VPS میتوانید یک پوشه آزمایشی بسازید و بدون هیچ پیامدی اشتباه کنید. راهنماهای مشابه دیگر در بخش آموزشها گردآوری شدهاند.
سؤالات متداول
آیا میتوان فایلی را که با rm حذف شده بازیابی کرد؟
بهندرت و بدون هیچ تضمینی. ابزارهایی مانند extundelete یا testdisk گاهی دادهها را پیدا میکنند، به شرط اینکه فوراً نوشتن روی دیسک را متوقف کنید. تنها محافظت قابل اعتماد، بکاپ است.
تفاوت rm -r و rm -rf چیست؟
rm -r بهصورت بازگشتی حذف میکند اما برای فایلهای محافظتشده در برابر نوشتن تأیید میخواهد. rm -rf حذف را اجباری میکند و فایلهای ناموجود را بیصدا نادیده میگیرد. آن را برای مواردی نگه دارید که هدف را از قبل بررسی کردهاید.
چگونه پوشهای را که نامش شامل فاصله است حذف کنیم؟
نام را در گیومه قرار دهید یا فاصلهها را escape کنید: rm -r "My folder" یا rm -r My\ folder. در غیر این صورت shell هر کلمه را یک آیتم جداگانه در نظر میگیرد.
آیا در خط فرمان سطل زباله وجود دارد؟
بله، از طریق بسته trash-cli (دستور trash-put) که بهجای پاک کردن، آیتمها را به سطل زباله کاربر منتقل میکند. روی یک سرور، معمولاً بهصورت پیشفرض نصب نیست: عادت کنید پیش از حذف، فهرست بگیرید.