Overview
A versatile script for bulk renaming files with multiple modes: pattern replacement, sequential numbering, and case conversion. Includes dry-run mode for safety.
The Script
#!/bin/bash
# Bulk File Rename Script
# Usage: ./bulk-rename.sh <mode> [options] <files...>
set -euo pipefail
DRY_RUN=false
VERBOSE=false
rename_file() {
local old="$1"
local new="$2"
if [ "$old" = "$new" ]; then
return
fi
if [ -e "$new" ]; then
echo "[SKIP] Target exists: $new"
return
fi
if [ "$DRY_RUN" = true ]; then
echo "[DRY] $old -> $new"
else
mv -- "$old" "$new"
[ "$VERBOSE" = true ] && echo "[OK] $old -> $new"
fi
}
mode_replace() {
local search="$1"
local replace="$2"
shift 2
for file in "$@"; do
[ -f "$file" ] || continue
local dir=$(dirname "$file")
local base=$(basename "$file")
local newbase="\${base//$search/$replace}"
rename_file "$file" "$dir/$newbase"
done
}
echo "Done!"Usage Examples
# Preview pattern replacement
./bulk-rename.sh -d replace "IMG_" "vacation_" *.jpg
# Sequential numbering with prefix
./bulk-rename.sh sequence "photo_" *.png
# Convert to lowercase
./bulk-rename.sh lower *.TXT *.JPG
# Add prefix to all SQL files
./bulk-rename.sh prefix "backup_" *.sqlOne-Liner Alternatives
# Replace spaces with underscores
for f in *\\ *; do mv "$f" "\${f// /_}"; done
# Lowercase all files
for f in *; do mv "$f" "\${f,,}" 2>/dev/null; done
# Add prefix
for f in *.jpg; do mv "$f" "prefix_$f"; done
# Sequential rename
n=1; for f in *.jpg; do mv "$f" "img_$(printf %03d $n).jpg"; ((n++)); done - rename
- bulk
- batch
- regex
- pattern
- files
- mv