8

我已将一个大文本文件拆分为许多较小的文件集,以进行我正在做的性能测试。有很多这样的目录:

/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 遍历这样的目录结构,并根据位置和该位置中的文件使用正确的参数执行命令?

4

6 回答 6

8

就像是:

for x in `find /home/brianonly -type f`
do
./yourexecutable -i $x -o $x.processed
done
于 2009-06-16T19:41:54.673 回答
8

对于这种事情,我总是将findxargs一起使用:

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

现在,由于您的脚本一次只处理一个文件,因此如前所述,直接使用-exec(或-execdir)与find一样有效,但我习惯于使用xargs,因为在喂食时通常效率更高一次对多个参数进行操作的命令。因此,它是一个非常有用的工具,可以放在一个人的实用腰带上,所以我认为应该提到它。

于 2009-06-16T20:06:52.097 回答
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 ';'
于 2009-06-16T19:56:58.807 回答
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
于 2009-06-16T20:25:00.203 回答
0

这就是find命令的用途。

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

于 2009-06-16T19:41:18.200 回答
0

使用查找和执行。看看以下

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

于 2009-06-16T19:46:58.080 回答