使用zsh重命名基于目录名称部分的文件

时间:2013-08-19 23:34:16

标签: shell directory zsh file-rename

我想根据目录名的一部分重命名目录中的文件。我有以下结构:

Sample_1234/all_R2.gz
Sample_2345/all_R2.gz
Sample_3456/all_R2.gz

在每个目录中,我根据多个其他文件的连接创建一个新文件。然后,我想仅使用目录名的数字部分命名新的连接文件。例如,

Sample_1234/1234_R2.gz
Sample_2345/2345_R2.gz
Sample_3456/3456_R2.gz

我可以返回我想要的目录名称部分:

pwd | grep -o '[0-9][0-9][0-9][0-9]'

但我无法使用zmv将其转换为新文件名。 zsh shell中的任何建议?谢谢,

1 个答案:

答案 0 :(得分:2)

请勿使用find,请使用zmv。使用( )对来获取所需的文件名,以及${1}${2}等来引用它们。这是我的文件夹结构:

$ ls **/*
Sample_1234/all_R2.gz  Sample_4567/all_R2.gz
Sample_2345/all_R2.gz  Sample_6890/all_R2.gz

Sample_1234:
all_R2.gz

Sample_2345:
all_R2.gz

Sample_4567:
all_R2.gz

Sample_6890:
all_R2.gz

这里是zmvassuming you've got it loaded

$ zmv -n 'Sample_(*)/all_R2.gz' 'Sample_${1}/${1}_R2.gz'
mv -- Sample_1234/all_R2.gz Sample_1234/1234_R2.gz
mv -- Sample_2345/all_R2.gz Sample_2345/2345_R2.gz
mv -- Sample_4567/all_R2.gz Sample_4567/4567_R2.gz
mv -- Sample_6890/all_R2.gz Sample_6890/6890_R2.gz

它从当前目录中获取文件名_/之间的所有内容,这允许我们引用目录名末尾的数字字符串。然后,我们使用${1}将其插回到文件名中,以替换all

使用zmv -n来查看在执行此操作之前会发生什么是非常值得的。