我想重命名多个文件夹,其名称如下:
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_newnames
stdin
newname
mv
|| break
read
list_of_newnames
bcf*/
赋值IFS=
和-r
选项在这里可能不是必需的,但允许newname
使用反斜杠字符和可能的前导空格。
echo
一旦您确信它正在做正确的事情,就将其删除。