【问题标题】:Running command recursively in linux在linux中递归运行命令
【发布时间】:2013-01-26 09:21:12
【问题描述】:

我正在尝试提出一个可以在每个子文件夹中运行 mp3gain FOLDER/SUBFOLDER/*.mp3 的命令,但我无法理解为什么此命令不起作用:

find . -type d -exec mp3gain \"{}\"/*.mp3 \;

运行时,每个文件夹和子文件夹都会出现错误Can't open "./FOLDER/SUBFOLDER"/*.mp3 for reading

如果我使用mp3gain "./FOLDER/SUBFOLDER"/*.mp3 手动运行命令,它可以工作。怎么了?

【问题讨论】:

    标签: linux recursion find


    【解决方案1】:

    如果你有一个固定的数据结构,比如

    folder1/subfolder1/
    folder1/subfolder2/
    folder2/subfolder1/
    [...]
    

    使用zshbash version >=4.0 你可以试试

    mp3gain **/*.mp3
    

    但要确保检查

    的输出
    ls **/*.mp3 
    

    在您认真对待 mp3gain 之前。

    【讨论】:

    • ** 语法(我喜欢)是bash 4 或zsh 中的新语法。有些贝壳没有它。然后ls **/*.mp3 就足够了(对于那些理解** 的shell)
    • 谢谢!更新了原来的答案:)
    【解决方案2】:

    当您从 shell 运行 mp3gain "./FOLDER/SUBFOLDER"/*.mp3 时,*.mp3 在传递给 mp3gain 之前被 shell 扩展。当find 运行它时,不涉及任何shell,并且*.mp3 被逐字传递给mp3gain。后者不知道如何处理通配符(因为通常不需要)。

    【讨论】:

    • 谢谢!使用-exec sh -c 'mp3gain "{}"/*.mp3' \; 包装 exec 命令有效。
    【解决方案3】:

    嗯。刚刚尝试通过将mp3gain 替换为echo 来测试如何解析目录并且它可以工作:

    find . -type d -exec echo {}\/\*.mp3 \;
    

    尝试运行您的命令版本,但使用echo 亲自查看文件输出:

    find . -type d -exec echo \"{}\"/*.mp3 \;
    

    似乎引号妨碍了您的原始命令。

    【讨论】:

      【解决方案4】:

      这行得通...

      find /music -name *mp3 -exec mp3gain -r -k {} \;
      

      【讨论】:

        猜你喜欢
        • 2015-09-27
        • 1970-01-01
        • 1970-01-01
        • 2011-11-01
        • 2021-05-11
        • 1970-01-01
        • 2015-06-03
        • 2016-06-01
        • 2020-06-24
        相关资源
        最近更新 更多