نکاتی در دستورات 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 این مشکل حل می‌شود.