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

tuc*_*nco 1 command-line bash

我想重命名多个命名如下的文件夹:

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 新手,所以任何帮助/想法都值得赞赏。

ste*_*ver 5

由于“旧名称”似乎是按词法排序的,并且假设“新名称”在文本文件中每行排列一个(即不能包含换行符),那么您应该能够使用一个简单的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一旦你对它做正确的事情感到满意,就删除它。