نکاتی در دستورات bash
دستورات مفید Shell/Bash
در این صفحه مجموعهای از دستورات پرکاربرد خط فرمان (Shell/Bash) برای پاکسازی فایلها و بررسی وضعیت پوشهها آورده شده است.
دستور find
یافتن فایلها با پسوند خاص
برای یافتن تمام فایلهای .json در یک پوشه:
find skins/ -type f -name '*.json'
نکته: حتماً از کوتیشن استفاده شود، چون بدون آن، الگو توسط shell گسترش مییابد.
جستوجوی غیر بازگشتی
برای جلوگیری از جستوجوی داخل زیرپوشهها:
find languages/i18n/ -maxdepth 1 -type f -name '*.json'
حذف یا انتقال فایلها به صورت دستهای
استفاده از -exec برای اجرای دستور بر روی نتایج:
find extensions -type d -name tests -exec rm -rf {} +
توضیح:
{}: مسیر هر مورد یافتشده+: همه را یکجا به دستور میدهد (بجای جدا جدا)
پیدا کردن همه فایلها به جز موارد خاص
مثلاً پیدا کردن همه فایلها در یک پوشه، به جز زبانهای خاص:
find languages/i18n/ -maxdepth 1 -type f \
! -name 'en*.json' \
! -name 'fa.json' \
! -name 'fr*.json' \
! -name 'de*.json'
دستور grep
پیدا کردن فایلهایی که شامل یک عبارت خاص هستند
مثلاً یافتن تمام فایلهایی که شامل sunday هستند:
grep -ilr 'sunday' languages/i18n/
-i: بدون حساسیت به حروف بزرگکوچک-l: فقط نام فایلها را چاپ میکند-r: جستوجوی بازگشتی
فایلهایی که شامل عبارت نیستند
grep -iLr 'sunday' languages/i18n/
فقط در سطح اول پوشه
برای جستوجوی غیربازگشتی:
find languages/i18n/ -maxdepth 1 -type f \
! -exec grep -iq 'sunday' {} \; -print
دستور du و stat
مشاهده حجم پوشه
du -sh .
مشاهده حجم کل فایلها (نه دایرکتوریها)
find . -type f -exec stat -c%s {} + | awk '{s+=$1} END {print s, "bytes"}'
برای دیدن خروجی بر حسب مگابایت:
find . -type f -exec stat -c%s {} + | awk '{s+=$1} END {printf "%.2f MB\n", s/1024/1024}'
نکته: استفاده از du باعث شمارش دایرکتوریها هم میشود، ولی stat فقط فایلها را میشمارد.
دستور wc
شمردن تعداد کل فایلها
find . -type f | wc -l
برای مقایسه قبل و بعد از عملیات:
find . -type f | tee before.txt | wc -l
# انجام عملیات
find . -type f | tee after.txt | wc -l
diff before.txt after.txt
دستور cp و mv
کپی کامل پوشه با حفظ مجوزها
cp -pR folder1 folder2
تفاوت حجم قبل و بعد از کپی
اگر بلافاصله بعد از کپی دستور du اجرا شود، ممکن است حجمها کمی متفاوت باشند. دلایل:
- بلاکبندی متفاوت فایلسیستم
- فایلهای sparse یا hard link
- metadata اضافی
دستور shopt
فعال کردن نمایش فایلهای مخفی در globها
shopt -s dotglob
for f in tests/*; do
echo "$f"
done
shopt -u dotglob
نکته: بهصورت پیشفرض دستور * فایلهای مخفی مثل .gitkeep را شامل نمیشود. با dotglob این مشکل حل میشود.