我想重命名多个命名如下的文件夹:
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
Run Code Online (Sandbox Code Playgroud)
等等。我总共有 96 个文件夹,最后一个是:
bcf_12_bcr_08
Run Code Online (Sandbox Code Playgroud)
另外,我有一个包含 96 个 ID 的列表,每行一个 ID。第一个文件夹(即bcf_01_bcr_01)必须用列表的第一个 ID 重命名(我有 txt 格式的列表),最后一个文件夹 ( bcf_12_bcr_08) 必须用列表的最后一个 ID 重命名。
我是 bash 新手,所以任何帮助/想法都值得赞赏。
由于“旧名称”似乎是按词法排序的,并且假设“新名称”在文本文件中每行排列一个(即不能包含换行符),那么您应该能够使用一个简单的for循环/shell glob,如
for oldname in bcf*/; do
IFS= read -r newname || break
echo mv --no-clobber -- "$oldname" "$newname"
done < list_of_newnames
Run Code Online (Sandbox Code Playgroud)
对于 each oldname,这会从文件list_of_newnamesvia 中读取一行stdin并将其分配给以newname与后续mv命令一起使用。的|| break只是导致循环在的情况下正常退出read失败(因为有更少的线list_of_newnames比匹配的目录bcf*/例如)。
在IFS=分配和-r选项也有可能不是必要的,但在这里允许newnames的反斜杠字符和可能导致的空白。
echo一旦你对它做正确的事情感到满意,就删除它。