如何编写脚本来执行多个目录中的文件

sln*_*yeo 4 bash shell-script

如何编写脚本来执行多个目录中的文件?

问题是这样的:我有很多目录,每个目录都有一个要由 python 脚本读取和分析的数据文件(比如,a.py)。我不想“cd”到每个目录并键入“a.py”。输出保存在每个目录中。

Sha*_*off 8

find 会为你工作的魔法。

find -name datafile.dat -execdir ~/a.py '{}' \;
Run Code Online (Sandbox Code Playgroud)

find 在所有子目录中递归搜索匹配一组规则的文件并对它们执行操作。

-name 规则将让您找到名称与您提供的名称相匹配的文件。您可以使用通配符,例如,“*.dat”会找到所有 .dat 文件。

如有必要,您可以使用 -regex 而不是 -name 来匹配正则表达式模式而不是 glob 模式,因此您可以执行 ".*\.dat$" 来匹配所有 .dat 文件。

-execdir 将从找到的文件的目录中执行您给它的任何命令,用找到的文件替换“{}”。


Mic*_*zek 7

你可能只使用一个for循环:

for i in first_dir second_dir third_dir; do
    pushd $i
    a.py
    popd
done
Run Code Online (Sandbox Code Playgroud)

它将pushd $i; a.py; popd$iset to运行first_dir,然后以$ias 运行second_dir,最后$i以 as 运行third_dirpushd切换到给定目录,然后popd切换回您所在的位置

  • 除了 pushd 和 popd,您还可以使用子shell - `(cd $i && a.py)`。此构造还可以防止 $i 不存在 - 如果 pushd 不起作用,您不想弹出。 (3认同)
  • @Michael、@camh、@sinyeo:**始终在变量替换周围加上双引号。**,例如`cd -- "$i"`。此外,通过在文件名之前传递 `--` 来保护命令不受以 `-` 开头的文件的影响。 (3认同)
  • 好吧,一如既往的评论是对的,但我不记得上次我发布一个小 shell 片段而没有人对这样的事情发表评论是什么时候——你们认真地编写了内置所有这些冗余的一次性循环吗?您正在防止目录不存在或有空格或以破折号开头,好像它需要接受任意输入;这是迭代静态数组“first_dir second_dirthird_dir”的一次性for循环——这些都不是问题 (2认同)
  • @Michael:我努力在我的公开帖子中包含正确的引用和适当的概括。我不知道随机读者何时会将一些答案复制到与原始上下文(读者不知道)完全不同的上下文中。使用引用和其他泛化技术可以极大地扩展可以正确应用任何给定代码片段的情况的广度。我也喜欢在我的交互使用中使用正确的引用等,因为我发现这种做法形成了在编写完整的 shell 程序时对我有益的习惯。 (2认同)