Bash:如何遍历目录结构并执行命令?

时间:2009-06-16 19:34:07

标签: linux bash command-line directory traversal

我已经将一个大文本文件拆分成了许多较小的文本文件,用于我正在进行的性能测试。有很多这样的目录:

/home/brianly/output-02 (contains 2 files myfile.chunk.00 and myfile.chunk.01)
/home/brianly/output-04 (contains 4 files...)
/home/brianly/output-06 (contains 6 files...)

重要的是要注意每个目录中的文件数量越来越多。我需要做的是对输出目录中的每个文本文件运行一个可执行文件。该命令对于单个文件看起来像这样:

./myexecutable -i /home/brianly/output-02/myfile.chunk.00 -o /home/brianly/output-02/myfile.chunk.00.processed

这里-i参数是输入文件,-o参数是输出位置。

在C#中,我遍历目录,获取每个文件夹中的文件列表,然后循环遍历它们以运行命令行。如何使用bash遍历这样的目录结构,并根据该位置的位置和文件使用正确的参数执行命令?

6 个答案:

答案 0 :(得分:8)

对于这种事情我总是使用 find xargs

$ find output-* -name "*.chunk.??" | xargs -I{} ./myexecutable -i {} -o {}.processed

现在,由于您的脚本一次只处理一个文件,使用 -exec (或 -execdir )直接使用 find ,因为建议,同样有效,但我习惯使用 xargs ,因为在提供同时操作多个参数的命令时,这通常会更有效。因此,它是一个非常有用的工具,保持在一个实用带,所以我认为它应该被提及。

答案 1 :(得分:7)

类似的东西:

for x in `find /home/brianonly -type f`
do
./yourexecutable -i $x -o $x.processed
done

答案 2 :(得分:2)

正如其他人所建议的那样,使用find(1)

# Find all files named 'myfile.chunk.*' but NOT named 'myfile.chunk.*.processed'
# under the directory tree rooted at base-directory, and execute a command on
# them:
find base-directory -name 'output.*' '!' -name 'output.*.processed' -exec ./myexecutable -i '{}' -o '{}'.processed ';'

答案 3 :(得分:1)

根据提供的信息,听起来这可能是您对C#理念的完全直接的翻译。

for i in /home/brianly/output-*; do
    for j in "$i/"*.[0-9][0-9]; do
        ./myexecutable -i "$j" -o "$j.processed"
    done
done

答案 4 :(得分:0)

这就是find命令的用途。

http://linux.die.net/man/1/find

答案 5 :(得分:0)

使用find和exec。看看下面的

http://tldp.org/LDP/abs/html/moreadv.html