يعيد هذا السكربت تسمية ملفات كثيرة في مرور واحد بتطبيق تعبير استبدال sed على كل اسم ملف، مع وضع معاينة آمن افتراضياً. يأخذ مجلداً وتعبير sed مثل 's/ /_/g' (استبدال المسافات بشُرَط سفلية) أو 's/\.jpeg$/.jpg/' (توحيد الامتدادات)، وراية --apply اختيارية. بعد set -euo pipefail، يتحقق من المجلد ويفعّل nullglob كي لا ينتج المجلد الفارغ تكرارات زائفة. ولكل ملف عادي يحسب الاسم الجديد عبر sed -E، ويتخطى الملفات التي لم يتغير اسمها، ثم يعاين أو ينفّذ النقل. والأهم أنه يستخدم mv -n كي لا يُطغى أبداً على هدف موجود بصمت، ويستخدم -- لمعالجة الأسماء التي تبدأ بشَرطة بأمان. شغّله للمعاينة: ./bulk_rename.sh ./pics 's/ /_/g'، ثم أضف --apply للتنفيذ. يحميك وضع المعاينة من إعادة تسمية غير مقصودة قبل الالتزام بالتغييرات.
إعادة تسمية الملفات بالجملة وفق نمط
يعيد تسمية ملفات كثيرة دفعة واحدة عبر استبدال sed مع معاينة آمنة.
1 مشاهدة
مشاركة
السكربت
تحميل .shbash
#!/usr/bin/env bash
#
# bulk_rename.sh - Rename multiple files using a sed-style substitution.
#
# Applies a 's/old/new/' transform to filenames in a directory, with a
# dry-run by default so you can preview before committing.
#
# Usage: ./bulk_rename.sh <dir> '<sed_expr>' [--apply]
#
# sed_expr e.g. 's/ /_/g' or 's/\.jpeg$/.jpg/'
# --apply perform the rename; otherwise only preview
#
set -euo pipefail
# --- Argument handling --------------------------------------------------------
if [[ $# -lt 2 || $# -gt 3 ]]; then
echo "Usage: $0 <dir> '<sed_expr>' [--apply]" >&2
echo "Example: $0 ./pics 's/ /_/g' --apply" >&2
exit 1
fi
DIR="$1"
SED_EXPR="$2"
APPLY=0
[[ "${3:-}" == "--apply" ]] && APPLY=1
[[ -d "$DIR" ]] || { echo "Error: '$DIR' is not a directory." >&2; exit 1; }
# --- Iterate over files safely ------------------------------------------------
shopt -s nullglob # an empty directory yields no iterations instead of '*'
RENAMED=0
for path in "$DIR"/*; do
[[ -f "$path" ]] || continue # skip subdirectories
name="$(basename "$path")"
newname="$(printf '%s' "$name" | sed -E "$SED_EXPR")"
# Nothing to do if the name is unchanged.
[[ "$name" == "$newname" ]] && continue
target="$DIR/$newname"
if (( APPLY )); then
# -n (no-clobber) prevents silently overwriting an existing target.
mv -n -- "$path" "$target"
echo "Renamed: $name -> $newname"
else
echo "[DRY RUN] $name -> $newname"
fi
RENAMED=$((RENAMED + 1))
done
if (( APPLY )); then
echo "Done. $RENAMED file(s) renamed."
else
echo "[DRY RUN] $RENAMED file(s) would be renamed. Add --apply to commit."
fiكيفية التشغيل
راجع السكربت أولاً، ثم حمّله أو انسخه وشغّله في بيئتك.
قد يعجبك أيضاً
bashlinuxمتوسط
مزامنة مجلد إلى مضيف بعيد عبر rsync فوق SSH
يطابق مجلداً محلياً مع خادم بعيد بأمان عبر SSH.
bashlinuxمتوسط
نسخ احتياطي لكل قواعد بيانات MySQL باستخدام mysqldump
يُفرغ كل قاعدة بيانات MySQL في ملف SQL مضغوط مستقل.
bashlinuxمتوسط
نسخ احتياطي لكل قواعد بيانات PostgreSQL باستخدام pg_dumpall
يُفرغ عنقود PostgreSQL كاملاً، مع الأدوار، في ملف مضغوط واحد.