HxHippy

Bulk File Rename Script

Rename multiple files using patterns, regex, or sequential numbering. Safe preview mode included.

Last updated: 2024-12-15

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_" *.sql

One-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
beginner File Operations Updated 2024-12-15
  • rename
  • bulk
  • batch
  • regex
  • pattern
  • files
  • mv