【问题标题】:Rename File Based on Portion of Directory Name using zsh使用 zsh 根据目录名称的一部分重命名文件
【发布时间】:2013-08-19 23:34:15
【问题描述】:

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

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中有什么建议吗?谢谢,

【问题讨论】:

    标签: shell directory zsh file-rename


    【解决方案1】:

    不要使用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 看看在你做之前会发生什么是非常值得的。

    【讨论】:

    • 非常感谢您的回答。由于某种原因,我直到现在才看到。还是有帮助的。