在linux中递归运行命令

时间:2013-01-26 09:21:13

标签: linux recursion find

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

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

运行时,我会为每个文件夹和子文件夹收到错误Can't open "./FOLDER/SUBFOLDER"/*.mp3 for reading

如果我使用mp3gain "./FOLDER/SUBFOLDER"/*.mp3手动运行命令,则可以正常运行。出了什么问题?

4 个答案:

答案 0 :(得分:3)

如果您有像

这样的固定数据结构
folder1/subfolder1/
folder1/subfolder2/
folder2/subfolder1/
[...]

并使用zshbash version >=4.0您可以尝试

mp3gain **/*.mp3

但要确保检查

的输出
ls **/*.mp3 

在你认真对待mp3gain之前。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

嗯。试过这个来测试如何通过用mp3gain替换echo来解析目录,并且它可以工作:

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

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

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

似乎引号会妨碍原始命令。

答案 3 :(得分:0)

这有效......

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