【问题标题】:Run an Executable Program File in Multiple Subdirectories Using Shell使用 Shell 在多个子目录中运行可执行程序文件
【发布时间】:2014-06-08 17:20:56
【问题描述】:

我有一个包含 361 个子目录的主目录。在每个子目录中,有一个参数文件和一个可执行程序文件。对可执行文件进行编码以在可执行文件所在的目录中查找参数文件。 (所有子目录下都是同一个可执行文件,所有子目录下参数文件都是同一个文件名)

不是单独执行程序文件,而是有一个cshell命令让终端一次运行它们吗?

【问题讨论】:

  • 因此,同一个可执行程序文件在所有子目录中。为什么?这毫无意义。
  • 因为对可执行文件进行了编码,在可执行文件所在的目录下查找参数文件。所以,可执行文件和参数文件需要在同一个目录下。
  • 您收到 Bash 答案是因为您使用了 bash 标记,但在文本中,您说您使用的是 csh。它是哪一个?它们是不相容的; Bash 脚本无法在 C shell 中运行,反之亦然(非常琐碎的脚本除外)。

标签: linux bash shell terminal command


【解决方案1】:

更新

如果你的 Linux 太旧了,没有-execdir,你可以试试这个:

find $(pwd) -name YourProgram -exec dirname {} \; | while read d; do cd "$d" && pwd; done

如果正确打印了您的程序需要运行的目录的名称,只需删除 pwd 并替换为您想要在该目录中执行的任何操作 - 大概是这样的:

find $(pwd) -name YourProgram -exec dirname {} \; | while read d; do cd "$d" && ./YourPrgram; done

原始答案

可能是这样的:

find . -type f -name YourProgramName -execdir ./YourProgramName YourParameterFile \;

但请先备份并在使用前检查它是否正确。

-execdir 导致find 在运行命令之前更改到它找到的目录。

如果你的命令比较复杂,你可以这样做:

 find . -type f -name YourProgramName -execdir sh -c "command1; command2; command3" \;

检查它是否符合您的要求:

 find . -type f -name YourProgramName -execdir pwd \;

【讨论】:

  • 已更新,请再看。
  • 如果我使用 ./{} 而不是 "YourProgramName" 会有所不同吗另外,如果对可执行文件进行编码以查找参数文件,我是否需要在命令中包含参数文件?
  • 我会输入程序名称,因为它对维护代码的任何人来说都更清楚,但您的建议也应该有效。如果可执行文件知道如何找到参数,那么它就可以正常工作而无需告诉可执行文件它们在哪里。
  • 谢谢!我试试看。
  • 我尝试了代码,但终端响应:无效谓词`-execdir'。我查了一下,一个论坛说这可能是因为我运行的是旧版本的 Linux。有没有其他可以工作的代码?
【解决方案2】:

也许这会有所帮助。假设您在每个文件夹中都有一个名为 params_file 的文件和一个名为 exec_file 的可执行文件,那么:

for dir in `find . -maxdepth 1 -mindepth 1 -type d` ; do 
    cd $dir
    cat params_file | xargs ./exec_file
    cd ..
done

【讨论】:

  • 我可能理解错了。我假设可执行文件的参数存储在文件中。无论如何,Mark Setchell 的回答要好得多。
  • Tudor Berariu,参数文件和可执行文件是存储在每个子目录中的两个独立文件。每个参数文件也是唯一的,尽管它在所有子目录中具有相同的名称。
  • 如果您需要发送“参数文件”的名称作为可执行文件的参数,那么,正如 Mark Setchell 所写,使用./exec_file params_file。如果您需要将“参数文件”的内容作为参数传递,那么您可能需要这个cat params_file | xargs ./exec_file。但是使用find-execdir,因为它更简洁。
  • 如果存在嵌套在级别 1 下的子目录,您可能希望使用-maxdepth 1 -mindepth 1 作为find 命令的选项。
  • 也许这会澄清一些事情......在每个子目录中,我有两个文件:一个可执行文件和一个参数文件。通常,我只需单击可执行文件,它会读取同一子目录中的参数文件。然后它会产生几个输出文件。
猜你喜欢
  • 2021-04-19
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
相关资源
最近更新 更多