inode ساختمان دادهای است که در فایل سیستم لینوکس اطلاعاتی مانند فایلها، دایرکتوریها و سایر خصوصیات فایلسیستم را دخیره میکند.
هر فایلسیستم تعداد محدودی inode (آینود) و در نتیجه میزان مشخص فایل را میتواند نگهداری کند.
چنانچه تعداد فایلهای فایلسیستم از میزان مشخصی بیشتر شود تعداد آینودهای مجاز آن فایلسیستم به اتمام میرسد و امکان ذخیره و ایجاد تعداد بیشتری فایل وجود نخواهد داشت.
برای یافتن تعداد آینودهای مجاز از دستور زیر استفاده کنید.
۱ |
df -i
|
خروجی این دستور میتواند به شکل زیر باشد.
۱
۲
|
Filesystem Inodes IUsed IFree IUse% Mounted on
rootfs ۶۰۵۰۶۱۱۲ ۳۲۶۱۹ ۶۰۴۷۳۴۹۳ ۱% /
|
اطلاعات بیشتر inodeها را با دستور زیر میتوان مشاهده کرد.
۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
|
# tune2fs -l /dev/sda1 | grep -i inode
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super
Inode count: ۱۳۱۰۷۲
Free inodes: ۱۳۱۰۳۷
Inodes per group: ۲۰۴۸
Inode blocks per group: ۲۵۶
First inode: ۱۱
Inode size: ۱۲۸
Journal inode: ۸
Journal backup: inode blocks
|
دستور بالا حداکثر تعداد آینود قابل اختصاص و آینودهای اختصاص یافته را نشان میدهد.
چنانچه آینودهای فایل سیستم پر شود تنها راهحل مشکل پاک کردن فایلها و دایرکتوریها است.
راههای متفاوتی برای پاک کردن فایلها وجود دارد. ابتدا باید فایلها را مشاهده کنیم، با دستور ls میتوانیم فایلها را مشاهده کنیم؛ اما اگر تعداد فایلهای درون یک دایرکتوری از تعداد مشخصی بیشتر باشد اجرای دستور ls بسیار زمانبر خواهد بود. بهعنوان مثال در یک دایرکتوری با ۵۱۰۰۰۰ فایل اجرای دستور ls حدودا ۵۳ ثانیه زمان خواهد برد.
۱
۲
|
time ls
0m31.325s
|
و از طرفی چنانچه بخواهیم سایر خصوصیات مانند زمان ایجاد و یا حجم فایل را مشاهده کنیم باید دستور ls را با پارامتر -l به کار ببریم دستور ls به شکل ls -l در دایرکتوری با ۵۱۰۰۰۰ فایل ۱ دقیقه و ۱۱ ثانیه زمان خواهد برد.
۱
۲
|
#time ls -l
0m18.900s
|
بهترین راه برای مشاده فایلها استفاده از دستور ls با پارامتر -۱ است. این دستور فایلهای یک دایرکتوری با ۵۱۰۰۰۰ فایل را در کمتر از ۱۸ ثانیه لیست خواهد کرد.
۱
۲
|
#time ls -1
0m18.900s
|
برای پاک کردن فایلها از دستور rm به همراه پارامتر -rf استفاده کنید.
۱ |
rm -rf /home/user/*
|
در لینوکس تعداد کاراکترهایی که میتوان به عنوان پارامتر به هر دستور پاس داد محدود است برای مشاهده این محدودیت در سیستم خود از دستور ریز استفاده کنید.
۱
۲
|
$getconf ARG_MAX
۲۰۹۷۱۵۲
|
در نتیجه چنانچه دستور rm -rf را در دایرکتوری اجرا کنیم که تعداد فایلهای آن از ۲۰۹۷۱۵۲-۴ بیشتر باشد دستور با خطای command: Argument list too long متوقف میشود و دلیل بروز خطا این است که تمام فایلها به عنوان پارمتر به دستور rm ارسال میشود در نتیجه تعداد کاراکتر پارامترها از حد مجاز فراتر خواهد بود.
برای رفع این مشکل چند راه متفاوت داریم.
نکته: در تمام مثالهای زیر میخواهیم ۵۱۰۰۰۰ فایل یک دایرکتوری را حذف کنیم.
استفاده از دستور find:
۱ |
find . -type f -exec rm '{}' \;
|
۱
۲
|
time find . -type f -delete
real ۷m44.217s
|
۱ |
find . -print0 | xargs -۰ rm
|
استفاده از دستور ls:
۱ |
ls -۱ | xargs rm -f
|
بهترین و سریعترین راه برای پاک کردن تعداد زیادی فایل در یک دایرکتوری استفاده از دستور ls -1 | xargs rm -f است.
گاهی اوقات تعداد بیشتر فایل میتواند اجرای دستور را با مشکل مواجه کند. به عنوان مثال فرض کنیم باید دو میلیارد فایل در یک دایرکتوری را حذف کنیم. از آنجا که تعداد فایلها بسیار بیشتر از میزان جافظه سیستم است اجرای این دستور غیر ممکن است برای رفع این مشکل ابتدا دستور ls را اجرا میکنیم و خروجی دستور را در فایل ذخیره میکنیم، در مرجله بعد اطلاعات را از فایل میخوانیم و با استفاده از دستور xargs فایلها را پاک میکنیم.
۱
۲
|
ls -۱ > file.txt
rm $(<file.txt)
|
۱ |
xargs rm < file.txt
|