开发工具

以下是几种常见的 Shell 批量修改文件名 的实用方法,涵盖添加前缀、后缀、替换字符、删除内容等场景,并提供详细说明和示例:

一、基础批量修改

1. 添加前缀

# 为所有 .txt 文件添加前缀 "backup_"
for file in *.txt; do
    mv "$file" "backup_${file}"
done


2. 添加后缀

# 为所有 .jpg 文件添加日期后缀(格式:20231001)
date=$(date +%Y%m%d)
for file in *.jpg; do
    mv "$file" "${file%.jpg}_${date}.jpg"
done


3. 修改扩展名

# 将所有 .html 文件扩展名改为 .htm
for file in *.html; do
    mv "$file" "${file%.html}.htm"
done



二、模式匹配与替换

1. 删除文件名中的空格

# 将所有文件名中的空格替换为下划线 _
for file in *\ *; do
    mv "$file" "${file// /_}"
done


2. 替换指定字符

# 将文件名中的 "old" 替换为 "new"
for file in *old*; do
    mv "$file" "${file//old/new}"
done


3. 删除特定字符串

# 删除文件名中的 "unused" 字符串
for file in *unused*; do
    mv "$file" "${file//unused/}"
done



三、按条件筛选修改

1. 修改特定长度的文件名

# 将所有长度超过 10 字符的文件名截断为前 10 字符
for file in *; do
    if [ ${#file} -gt 10 ]; then
        mv "$file" "${file:0:10}"
    fi
done


2. 根据文件内容修改

# 将包含 "ERROR" 的日志文件重命名
grep -l "ERROR" *.log | while read file; do
    mv "$file" "error_${file}"
done


四、高级工具辅助

1. 使用 rename 命令 (Perl版本)

# 安装 rename 工具(Ubuntu/Debian)
sudo apt install rename

# 将所有 .txt 文件名中的 "file" 替换为 "document"
rename 's/file/document/g' *.txt

# 将文件名转为小写
rename 'y/A-Z/a-z/' *


2. 递归处理子目录文件

# 递归修改所有子目录中的 .png 文件名(添加前缀)
find . -type f -name "*.png" | while read file; do
    dir=$(dirname "$file")
    base=$(basename "$file")
    mv "$file" "$dir/prefix_$base"
done



五、安全操作与测试

1. 预演修改结果(不实际执行)

# 使用 echo 预览修改后的文件名
for file in *.txt; do
    echo "mv \"$file\" \"new_${file}\""
done


2. 备份原始文件

# 批量修改前先复制到备份目录
mkdir -p backup
cp *.txt backup/



六、完整脚本示例

#!/bin/bash
# 功能:批量将文件名中的日期格式从 YYYYMMDD 改为 DD-MM-YYYY
# 示例:file_20231001.log → file_01-10-2023.log

for file in *_????????.*; do
    # 提取原日期部分(假设日期为8位数字)
    original_date=$(echo "$file" | grep -oE '[0-9]{8}')
    if [ -n "$original_date" ]; then
        # 格式化日期:YYYYMMDD → DD-MM-YYYY
        new_date="${original_date:6:2}-${original_date:4:2}-${original_date:0:4}"
        # 生成新文件名
        new_name="${file%$original_date*}$new_date${file##*$original_date}"
        mv "$file" "$new_name"
    fi
done

注意事项

1、空格和特殊字符:文件名包含空格或 *、? 等符号时,用双引号包裹变量(如 "$file")。

2、大小写敏感:Shell 默认区分大小写,rename 或 tr 命令可处理大小写转换。

3、覆盖风险:若新文件名已存在,mv 会覆盖文件,建议先检查冲突。

通过以上方法,您可以高效完成各类批量文件名修改任务!建议先在测试目录中验证效果,再应用于正式数据。