【问题标题】:execute command in subdirectories在子目录中执行命令
【发布时间】:2013-06-10 08:28:04
【问题描述】:

我想为存在于不同子目录中的文件运行程序,然后将输出重定向到输出文件。我希望将输出保存到程序运行的目录中。

所以我想做这样的事情:

for x in */*.txt; do command $x > output.fsa; done

我的问题是:

  1. 上面的循环是否正确?我应该更改目录以将输出保存在执行命令的目录中还是由 linux 处理?
  2. 关于如何在输出文件中给出目录名称的任何想法?

【问题讨论】:

    标签: unix redirect for-loop output


    【解决方案1】:

    上面的循环是否正确?

    是的

    我应该更改目录以将输出保存在执行命令的目录中还是由 linux 处理?

    您无需更改目录,只需将输出重定向到正确目录中的文件即可:

    for x in */*.txt; do command $x > `dirname $x`/output.fsa; done
    

    【讨论】:

    • 我想你的意思是dirname,而不是basename
    • 很好,我可以看到目录名会给输出文件提供不同的名称。
    • 除非你调用命令cd你当前的工作目录不会改变。所以在循环中的每个地方你仍然有相同的 cwd (pwd)。所以是的,您需要指定输出的目录名。您正在将其重定向到相对路径,而不是绝对路径,请阅读更多相关信息:)
    【解决方案2】:

    循环是正确的,您将遍历当前 pwd 的子目录中的所有 txt 文件(正在执行此脚本或命令的位置)。您不必更改目录即可将输出保存在该子目录中。 Linux 不关心它:)

    您可以使用变量扩展 ${x%%/*} 删除第一个 / 之后的所有内容

    试试

    for x in */*.txt; do
      command "$x" > "${x%%/*}"/output.fsa
    done
    

    请记住,如果您在该子目录中有更多 txt 文件,您将多次执行命令“$x”并重写 output.fsa。

    在这种情况下,您可以使用 append (>>)

    试试

    for x in */*.txt; do
      echo "Executing command \"$x\"" >> "${x%%/*}"/output.fsa
      command "$x" >> "${x%%/*}"/output.fsa
    done
    

    【讨论】:

      猜你喜欢
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      相关资源
      最近更新 更多