我在不同的目录中有一个名为 filename.sh 的文件。我正在尝试同时提交此文件以在多个集群节点上运行。我需要在任何地方找到这个文件,cd 到它们的包含文件夹并执行命令“sbatch run_code.sh”这是我尝试过的。
find . -mindepth 1 -type f -name filename.sh -exec sbatch run_code.sh {} \;
它可以工作,除了它从当前文件夹运行命令,该文件夹不包含运行代码所需的依赖项。
或者我倾向于这样的for循环
for d in dirname; do
cd "$(dirname "$(find . -type f -name filename.sh)")" && sbatch run_code.sh)
done
这是行不通的。我期待在这里得到一些帮助。请。
听起来像你想要的:
-mindepth 1
是多余的。它排除了.
,但.
无论如何都被-type f
和排除了-name filename.sh
。-execdir
(来自 BSD),不是标准find
谓词,但如果您find
支持-mindepth
(尽管来自 GNU 也是非标准的),它也将支持-execdir
.-execdir
正是为此。就像-exec
它在所选文件的父目录中运行命令一样。在这里,根据find
实现,正在运行的命令将是sbatch run_code.sh ./filename.sh
或sbatch run_code.sh filename.sh
。{}
如果您不希望将filename.sh
作为参数传递给命令,请删除。对于
find
不支持的实现-execdir
,您可以执行以下操作:${1%/*}
是$1
,但删除了最短的尾部匹配/*
,所以它会表现得像"$(dirname -- "$1")"
但更有效和更可靠¹。${1##*/}
删除最长的头部匹配*/
,给你一个类似basename
的结果。或者为了避免
sh
每个文件运行一个:使用
zsh
外壳,您还可以执行以下操作:(
exec
(保存进程)不是必需的,因为zsh
它已经隐式地用于子shell中运行的最后一个命令)。$f:h
扩展到$f
'sh
ead (dirname) 和$f:t
它的t
ail (basename)。例如,如果目录名称以换行符结尾,¹ 仍然可以工作;在某些情况下,使用
dirname
(或zsh
's$var:h
)会产生更好的结果,尽管当获取dirname
of 的路径没有任何字符/
或以/
字符结尾时。