使用命令行参数实现Bash脚本批量重命名文本文件
实现
duplq.sh批量重命名脚本 没问题,我帮你写一个完全符合需求的duplq.sh脚本,还加了不少健壮性检查,避免意外覆盖或者参数错误的问题。
完整脚本代码
#!/bin/bash # 检查参数数量是否正确 if [ $# -ne 3 ]; then echo "错误:请提供3个参数!用法:$0 <前缀> <起始数字> <偏移量>" exit 1 fi prefix="$1" start_num="$2" offset="$3" # 检查起始数字和偏移量是否为正整数(如果需要允许起始数字为0,可把正则改成^[0-9]+$) if ! [[ "$start_num" =~ ^[1-9][0-9]*$ ]] || ! [[ "$offset" =~ ^[1-9][0-9]*$ ]]; then echo "错误:第二个和第三个参数必须是正整数!" exit 1 fi # 遍历当前目录下所有以指定前缀开头的txt文件 for file in "${prefix}"*.txt; do # 跳过不存在的文件(避免没有匹配文件时遍历到字面量) if [ ! -f "$file" ]; then continue fi # 提取文件名中的数字部分,仅保留严格符合「前缀+数字+.txt」格式的文件 num=$(echo "$file" | sed -E "s/^${prefix}([0-9]+)\.txt$/\1/") if [ -z "$num" ]; then continue fi # 只处理数字大于等于起始数字的文件 if [ "$num" -lt "$start_num" ]; then continue fi # 计算新文件名的数字部分 new_num=$((num + offset)) new_file="${prefix}${new_num}.txt" # 检查新文件是否已存在,避免意外覆盖 if [ -f "$new_file" ]; then echo "警告:文件 $new_file 已存在,跳过 $file 的重命名" continue fi # 执行重命名并输出日志 mv "$file" "$new_file" echo "已重命名:$file → $new_file" done
脚本逻辑说明
我给你拆解下每个部分的作用:
- 参数校验:首先检查是否传入了3个参数,然后验证第二个、第三个参数是正整数(如果你的需求里允许起始数字为0,把正则改成
^[0-9]+$即可),不符合就提示错误并退出。 - 文件遍历:只遍历当前目录下以指定前缀开头的
.txt文件,并且会跳过不存在的文件(防止没有匹配文件时处理pic*.txt这个字面量)。 - 格式过滤:用
sed提取文件名里的数字部分,只有严格符合「前缀+数字+.txt」格式的文件才会被处理,比如pic_0.txt或者picabc.txt这类不符合的会被跳过。 - 范围控制:只处理数字大于等于起始数字的文件,比如你传入起始数字0,就从
pic0.txt开始处理;如果传入起始数字2,就只会处理pic2.txt及之后的文件。 - 安全重命名:重命名前会检查新文件名是否已存在,如果存在就跳过并给出警告,避免不小心覆盖已有文件。
使用示例
- 先给脚本加执行权限:
chmod +x duplq.sh
- 执行你提到的命令:
./duplq.sh pic 0 3
执行后你会看到类似这样的输出:
已重命名:pic0.txt → pic3.txt 已重命名:pic1.txt → pic4.txt 已重命名:pic2.txt → pic5.txt 已重命名:pic3.txt → pic6.txt
注意事项
- 脚本只会处理当前目录下的文件,不会递归处理子目录里的文件。
- 如果有文件不符合「前缀+数字+.txt」的格式,会自动跳过,不会误处理。
- 重命名操作是不可逆的,建议执行前先备份文件,或者先运行脚本看输出日志确认没问题再实际执行(可以先把
mv命令改成echo mv来做模拟测试)。
内容的提问来源于stack exchange,提问作者a_avelar
相关产品推荐
相关产品推荐

