【问题标题】:How to rename files in current directory and its subdirectories using bash script?如何使用 bash 脚本重命名当前目录及其子目录中的文件?
【发布时间】:2012-05-19 14:15:57
【问题描述】:

我可以使用“重命名”命令将缺少的字符添加到当前目录中的所有文件名,如下所示:

echo "Renaming files..."
rename -v "s/^abcd124(.+)/abcd1234$1/" *.wav.gz;
echo "Done."

但是,我想对当前目录和它的所有子目录执行此操作。我试过这个:

echo "Renaming files..."
for dir in $(find ./ -type d); do
    rename -v "s/^$dir\/abcd124(.+)/$dir\/abcd1234$1/" *.wav.gz;
done;
echo "Done."

但是,如果 $dir 变量包含以下任何特殊字符:{}[]()^$.|*+?\,则它们无法使用 \ 正确转义,我的脚本将失败。

解决此问题的最佳方法是什么?另外,你们觉得用awk来解决这个问题怎么样(优点/缺点?)

【问题讨论】:

    标签: bash shell command-line rename subdirectory


    【解决方案1】:

    你也可以试试:

    find . -name "*.wav.gz" | xargs rename -v "s/abcd124*/abcd1234$1/"
    

    它适用于具有“xargs”命令的较新的 Unix 系统。请注意,我稍微编辑了正则表达式。

    【讨论】:

    • 对于包含空格的文件名将失败。
    • 这是真的。尽管我现在需要重命名的所有文件的文件名中都没有空格,但我将来使用的文件可能会。如何使脚本占文件名中的空格?
    【解决方案2】:

    试试:

    find ./ -type d -execdir rename -v "s/^abcd124(.+)/abcd1234\1/" *.wav.gz ";"
    

    Find 确实已经为您的文件提供了一个迭代器 - 您不需要在它周围使用 for 或在后面使用 xargs ,这些都是常见的。好吧 - 在极少数情况下,它们可能会有所帮助,但通常不会。

    在这里,-execdir 很有用。 Gnu-find 有它;我不知道你的发现是否也有。

    但是您需要确保在您启动此命令的目录中没有 *.wav.gz 文件,因为否则您的 shell 会扩展它,并将扩展的名称交给重命名。

    注意:我从重命名中收到警告,我应该在正则表达式中将 \1 替换为 $1,但如果这样做,则不会捕获该模式。我必须使用 \1 才能使其工作。

    这是另一种方法。如果我们搜索 wav.gz 文件,为什么还要搜索目录?

    find . -name "*.wav.gz" -exec rename -v "s/^abcd124(.+)/abcd1234\1/" {} ";"
    

    【讨论】:

    • 没用! :( 我运行了它,它没有重命名任何东西。我尝试删除“* .wav.gz”周围的引号,在这种情况下,它将一个文件重命名为 abcd1234(不识别 $1),然后无法重命名其他的,因为它们与 abcd1234 冲突。不过,感谢您的建议,我学到了很多东西。还有其他想法吗?
    • @jessica:你是对的。我更改了代码和解释,请参阅最后 2 段。
    • 这也不起作用——它给了我起始目录中每个文件的警告,不重命名它们,也不查看它的子目录。此外,出于我的目的,脚本需要从起始目录中运行,并且不能为每个文件打印出警告。它必须是防弹的!
    • 好吧,我测试了它,它对我有用。现在我做了第二种方法(最后两行),我也进行了测试。它也有效,也给了我警告,但如果我认真对待警告,它就不起作用。当然,您可以通过附加2>/dev/null 来消除警告。或者你打开 rename 所在的 perl 脚本,并在那里隐藏/更正它。或提交错误报告以重命名。或者重写你需要的 rename 部分,但我不会。我会忍受这些警告。程序是否防弹不取决于警告消息,我可以向你断言,但我也会持怀疑态度。
    • 你给我的最后一个脚本对我也不起作用 - 它警告所有要重命名的文件(包括文件名中带有空格的文件),但没有重命名它们!
    【解决方案3】:

    在bash 4:

    shopt -s globstar
    rename -v "s/^$dir\/abcd124(.+)/$dir\/abcd1234$1/" **/*.wav.gz;
    

    【讨论】:

      【解决方案4】:

      请注意,Gentoo Linux 的重命名实用程序指向

      http://developer.berlios.de/project/showfiles.php?group_id=413

      通过它的 ebuild

      http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/sys-apps/rename/rename-1.3.ebuild?view=markup

      对于 Debian 或 Ubuntu,

      rename 是 /usr/bin/prename,这是一个 perl 脚本

      请在搬家前查看rename --help。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-13
        • 2021-11-27
        • 2017-11-20
        • 2015-08-02
        • 2014-09-27
        • 1970-01-01
        • 2010-12-29
        • 1970-01-01
        相关资源
        最近更新 更多