Unix 在子目录中执行命令

Unix 在子目录中执行命令,unix,redirect,for-loop,output,Unix,Redirect,For Loop,Output,我想为存在于不同子目录中的文件运行一个程序,然后将输出重定向到输出文件。我希望将输出保存到程序运行的目录中 所以我想这样做: for x in */*.txt; do command $x > output.fsa; done 我的问题是: 上面的循环正确吗?我应该更改目录,以便将输出保存在执行命令的目录上,还是由linux负责 关于如何在输出文件中给出目录名,有什么想法吗 循环是正确的,您将迭代当前pwd子目录中的所有txt文件(执行此脚本或命令的地方)。您无需更改目录即可将输出保存到

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

所以我想这样做:

for x in */*.txt; do command $x > output.fsa; done
我的问题是:

  • 上面的循环正确吗?我应该更改目录,以便将输出保存在执行命令的目录上,还是由linux负责
  • 关于如何在输出文件中给出目录名,有什么想法吗

  • 循环是正确的,您将迭代当前pwd子目录中的所有txt文件(执行此脚本或命令的地方)。您无需更改目录即可将输出保存到该子目录中。Linux不关心它:)

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

    试一试

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

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

    试一试

    上面的循环正确吗

    我应该更改目录,以便将输出保存在执行命令的目录上,还是由linux负责

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

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

    我想你的意思是
    dirname
    ,而不是
    basename
    。很好,我可以看到dirname将为输出文件提供不同的名称。除非调用命令
    cd
    ,否则当前的工作目录不会更改。因此,在循环中的每个地方,您仍然有相同的cwd(pwd)。因此,是的,您需要为输出指定dirname。您正在将其重定向到相对路径,而不是绝对路径,请阅读有关它的更多信息:)
    for x in */*.txt; do
      echo "Executing command \"$x\"" >> "${x%%/*}"/output.fsa
      command "$x" >> "${x%%/*}"/output.fsa
    done
    
    for x in */*.txt; do command $x > `dirname $x`/output.fsa; done