【问题标题】:Bash: how to traverse directory structure and execute commands?Bash:如何遍历目录结构并执行命令?
【发布时间】:2010-11-03 11:06:41
【问题描述】:

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

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

【问题讨论】:

    标签: linux bash command-line directory traversal


    【解决方案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
    

    【讨论】:

      【解决方案2】:

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

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

      现在,由于您的脚本一次只处理一个文件,因此直接使用 -exec(或 -execdir)和 find,就像已经建议,同样有效,但我习惯使用 xargs,因为在一次输入对多个参数进行操作的命令时,这通常效率更高。因此,它是一个非常有用的工具,可以随身携带,所以我认为应该提到它。

      【讨论】:

        【解决方案3】:

        正如其他人建议的那样,使用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 ';'
        

        【讨论】:

          【解决方案4】:

          使用查找和执行。看看下面的

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

          【讨论】:

            【解决方案5】:

            类似:

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

            【讨论】:

            • find 前后有反引号
            • for x in $(find /home/brianonly -type f); do ... done $() so 比反引号更具可读性。我的 $.02。
            • 我想你会尝试处理处理过的文件。
            • 丹尼斯,你是对的。我坚持我的免责声明:类似:)
            【解决方案6】:

            这就是find 命令的用途。

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

            【讨论】:

              猜你喜欢
              • 2018-01-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-06-05
              • 2011-12-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多