Bash中如何按分隔符拆分字符串并交换子串位置
批量重命名方案优化
你当前使用的ls管道awk的方案仅能打印转换后的文件名,无法完成实际重命名操作,同时依赖ls解析文件名的方式存在兼容性缺陷,遇到带空格、特殊字符的文件名时会出现解析错误。以下是两种更稳定高效的实现方案:
方案1:Bash原生遍历(兼容性最高,无外部依赖)
纯Bash内置语法实现,不需要依赖awk、rename等外部命令,适配所有标准Bash环境:
# 先执行下面的预览命令确认输出符合预期 for file in *.txt; do name="${file%.*}" ext="${file##*.}" echo mv -- "$file" "${ext}.${name}" done # 确认预览无误后,去掉echo执行实际重命名 for file in *.txt; do name="${file%.*}" ext="${file##*.}" mv -- "$file" "${ext}.${name}" done
语法说明:
${file%.*}:删除变量file中最后一个.及之后的所有内容,提取得到文件名前缀a/b/c等${file##*.}:删除变量file中最后一个.及之前的所有内容,提取得到后缀txt- 命令中的
--用于避免文件名以-开头时,被mv误识别为命令参数
方案2:rename单行命令(更简洁)
如果环境中预装了Perl版本的rename(多数主流Linux发行版、macOS通过brew安装后默认带该工具),可以直接用正则匹配完成批量重命名:
# 加-n参数先预览重命名结果 rename -n 's/^([^.]+)\.txt$/txt.$1/' *.txt # 预览无误后去掉-n执行实际重命名 rename 's/^([^.]+)\.txt$/txt.$1/' *.txt
内容的提问来源于stack exchange,提问作者Prajwal T
相关产品推荐
相关产品推荐

