将命令应用于目录中的所有文件,一次一个目录

将命令应用于目录中的所有文件,一次一个目录

我想将重放增益信息应用于我音乐收藏中的所有 MP3 文件。为此,我使用一个名为mp3增益(在 Linux 上)。

为了正确应用专辑增益,我需要在每个目录上运行 mp3gain 命令。换句话说,我需要找到一个目录,对该目录中的所有文件运行 mp3gain,然后对其他每个目录重复此操作。到目前为止,我已经想到了这一点:

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

输出如下所示(仅显示众多目录中的几个):

[...]
./dev2/Physicist/*.mp3
Can't open ./dev2/Physicist/*.mp3 for reading
./Real Things/*.mp3
Can't open ./Real Things/*.mp3 for reading

在我看来,' *' 正在被转义,因此它不是寻找所有以 '.mp3' 结尾的文件,而是寻找名为 ' *.mp3' 的文件。

我应该使用什么命令?

答案1

看起来它没有正确匹配。像这样如何:

#!/bin/bash
OLDIFS=$IFS
IFS=$(echo -en "\n\b")
for dir in $(find . -type d)
do
        mp3gain $dir/*
done
IFS=$OLDIFS

作为单个命令:

OLDIFS=$IFS;IFS=$(echo -en "\n\b");for dir in $(find . -type d);do mp3gain $dir/*;done;IFS=$OLDIFS

答案2

它可能看起来不太好看,但这个命令会找到所有包含 mp3 文件的目录,将它们写入临时文件,然后浏览该临时文件,列出每个目录的内容。如果您对输出感到满意,您可以继续将 mp3gain 命令插入其中以代替 ls。

将 IFS 变量设置为换行符很重要,这样您就可以处理包含空格的文件和目录。

我之所以选择首先列出包含 mp3 的目录,是为了防止 mp3gain 在遇到空文件集时抛出错误。这样它就不会遇到这种情况。

IFS=$'\n'; for i in `find -type f -iname *.mp3`; do dirname $i ; done | sort | uniq > ~/mp3directories.txt && for i in `cat ~/mp3directories.txt`; do ls -1 $i/*.mp3 ; echo ; done

答案3

您可以使用 Rebol,它适用于 Unix 和 Windows

如何递归地将函数应用于目录中的所有文件

http://reboltutorial.com/blog/how-to-apply-a-function-to-all-files-in-a-directory-recursively/

相关内容