根据列表重命名多个文件夹

根据列表重命名多个文件夹

我想重命名多个文件夹,其名称如下:

bcf_01_bcr_01
bcf_01_bcr_02
bcf_01_bcr_03
bcf_01_bcr_04
bcf_01_bcr_05
bcf_01_bcr_06
bcf_01_bcr_07
bcf_01_bcr_08
bcf_02_bcr_01
bcf_02_bcr_02
bcf_02_bcr_03
bcf_02_bcr_04

等等。我总共有 96 个文件夹,最后一个是:

bcf_12_bcr_08

另外,我有一个包含 96 个 ID 的列表,每行一个 ID。第一个文件夹(即bcf_01_bcr_01)必须用列表的第一个 ID 重命名(我的列表为 txt 格式),最后一个文件夹(bcf_12_bcr_08)必须用列表的最后一个 ID 重命名。

我是 bash 新手,因此感谢任何帮助/想法。

答案1

由于“旧名称”似乎是按词汇顺序排列的,并且假设“新名称”在文本文件中每行排列一个(即不能包含换行符),那么你应该能够使用一个简单的for循环/shell glob,例如

for oldname in bcf*/; do 
  IFS= read -r newname || break
  echo mv --no-clobber -- "$oldname" "$newname"
done < list_of_newnames

对于每个,这将从文件via 中oldname读取一行并将其分配给,以便将其与后续命令一起使用。如果失败(例如,因为 中的行数少于匹配的目录数), just 会导致循环正常退出。list_of_newnamesstdinnewnamemv|| breakreadlist_of_newnamesbcf*/

赋值IFS=-r选项在这里可能不是必需的,但允许newname使用反斜杠字符和可能的前导空格。

echo一旦您确信它正在做正确的事情,就将其删除。

相关内容