Linux下依据空格分隔文本文件重命名子目录文件及文件夹咨询
原有命令局限性
你当前使用的xargs -r -a files.txt -L1 mv仅会逐行读取映射文件的两个参数直接执行移动操作,没有匹配处理子目录内文件的逻辑,因此只能完成根目录文件夹的重命名,无法处理子目录内带前缀的文件。
实现方案
注意必须先重命名子目录内的目标文件,再修改上层目录名称,避免重命名目录后找不到对应路径下的文件
你可以使用如下bash脚本完成需求:
#!/bin/bash # 逐行读取映射文件 while read -r old_dir new_dir; do # 校验旧目录存在再执行操作 if [ -d "$old_dir" ]; then # 第一步:递归重命名该目录下所有带旧目录名前缀的文件 find "$old_dir" -type f -name "${old_dir}*" | while read -r file_path; do # 提取原始文件名 file_name=$(basename "$file_path") # 替换文件名中的旧目录前缀为新前缀 new_file_name="${file_name/$old_dir/$new_dir}" # 执行文件重命名 mv "$file_path" "${old_dir}/${new_file_name}" done # 第二步:重命名根目录下的文件夹 mv "$old_dir" "$new_dir" fi done < files.txt
使用步骤
- 将上述代码保存为
batch_rename.sh,和你的files.txt放在同一级目录下 - 给脚本添加执行权限:
chmod +x batch_rename.sh - 预览验证操作(必做,避免误操作):将脚本中两个
mv命令前都加上echo,执行脚本后会打印所有要执行的重命名操作,确认操作符合预期后再去掉echo - 正式执行脚本:
./batch_rename.sh
注意事项
- 执行操作前建议先备份目标目录和文件,避免误操作导致数据丢失
- 如果需要匹配的旧目录名不是出现在文件名前缀,可以调整
find的-name匹配规则和字符串替换逻辑 - 如果需要处理子目录下的子文件夹而非仅文件,可以修改
find的-type f参数为-type f -o -type d
内容的提问来源于stack exchange,提问作者soosa
相关产品推荐
相关产品推荐

