如何编写Bash脚本批量重命名指定目录下的各类文件?
Bash脚本实现批量重命名文件为「前缀_序号.原扩展名」
直接给你可以运行的完整脚本,解决你的批量重命名需求:
#!/bin/bash # 检查参数数量是否正确 if [ $# -ne 2 ]; then echo "用法: $0 <自定义前缀> <目标目录>" exit 1 fi prefix="$1" target_dir="$2" # 验证目标目录是否存在 if [ ! -d "$target_dir" ]; then echo "错误: 目标目录 $target_dir 不存在" exit 1 fi orderCount=1 # 遍历目标目录下的所有普通文件(跳过子目录) for file in "$target_dir"/*; do if [ -f "$file" ]; then # 提取文件名(去掉路径) filename=$(basename "$file") # 提取文件扩展名(最后一个.后面的部分) extension="${filename##*.}" # 处理无扩展名的文件 if [ "$filename" = "$extension" ]; then new_name="${prefix}_${orderCount}" else new_name="${prefix}_${orderCount}.${extension}" fi # 执行重命名,-v参数显示操作过程 mv -v "$file" "$target_dir/$new_name" # 计数器递增 ((orderCount++)) fi done echo "重命名完成,共处理 $((orderCount-1)) 个文件"
你的伪代码里的几个关键问题修正:
- 计数器位置错误:你把
orderCount=1写在循环内部,导致每次循环都会重置为1,必须把它放在循环外面才能保证序号连续递增。 - 遍历路径错误:
for file in $2只会遍历目录名本身,而不是目录下的文件,正确写法是"$target_dir"/*,加引号是为了处理文件名包含空格的情况。 - 扩展名提取缺失:用
${filename##*.}可以精准提取文件的扩展名(如果文件没有扩展名,这个值会等于文件名本身,我们专门做了判断处理)。 - 变量引用未加引号:文件名如果包含空格、特殊字符,不加引号会导致
mv命令出错,所有变量引用都要加上双引号。 - 缺少参数和目录校验:脚本加入了参数数量检查和目录存在性验证,避免用户误操作。
使用方法:
- 把上面的代码保存为
rename_files.sh - 赋予执行权限:
chmod +x rename_files.sh - 运行脚本:
./rename_files.sh droneProject /path/to/your/directory
这样就能把目标目录下的所有文件重命名为droneProject_1.txt、droneProject_2.png这类格式,无扩展名的文件会变成droneProject_3这种形式。
内容的提问来源于stack exchange,提问作者Devon
相关产品推荐
相关产品推荐

