使用文本文件重命名文件夹中的批处理文件

rename batch files in folder using a textfile

我有一个以特定字符串开头的文件文件夹,我想使用文本文件中的相应列替换部分字符串

包含文件的文件夹

 ABC_S1_002.txt
 ABC_S1_003.html
 ABC_S1_007.png
 NMC_D1_002.png
 NMC_D2_003.html

我有一个文本文件,其中包含要替换的字符串:

ABC ABC_newfiles
NMC NMC_extra

所以重命名后的文件夹将是

 ABC_newfiles_S1_002.txt
 ABC_newfiles_S1_003.html
 ABC_newfiles_S1_007.png
 NMC_extra_D1_002.png
 NMC_extra_D2_003.html

我尝试使用 mv 逐个文件

for f in ABC*; do mv "$f" "${f/ABC/ABC_newfiles}"; done

如何读取第一列中包含旧字符串的文本文件并将其替换为第二列中的新字符串?我试过了

IFS=$'\n'; for i in $(cat file_rename);do oldName=$(echo $i | cut -d $'\t' -f1);  newName=$(echo $i | cut -d $'\t' -f2); for f in oldName*; do mv "$f" "${f/oldName/newName}"; done ; done

虽然没用。

查看

的结果
sed -r 's#([^ ]*) (.*)#for f in *; do mv "$f" "${f//}"; done#' textfile

如果看起来不错,您可以复制粘贴结果或将其包装在 source:

source <(sed -r 's#([^ ]*) (.*)#for f in *; do mv "$f" "${f//}"; done#' textfile)

这可能对你有用(GNU 并行和重命名):

parallel --colsep ' ' rename -n 's/{1}/{2}/' {1}* :::: textFile

这将列出 textFile 中每一行的重命名命令。

检查输出后,删除 -n 选项和真正的 运行。

对于 sed 解决方案,请尝试:

sed -E 's#(.*) (.*)#ls *| sed "h;s///;H;g;s/\n/ /;s/^/echo mv /e"#e' testFile

同样,这将 echo mv 命令输出,检查后,删除 echo 和 运行。