如何使用“ find -exec”在找到的文件目录(不是当前目录)中执行命令?


15

比方说,我在其中有一些子目录,目录dir1dir2dir3。这些目录中的每个目录都有一个文件foo,我想foo在每个目录中的每个目录上执行相同的命令,并从该目录内部执行该命令。

如果我要“手工”进行操作,它将看起来像这样:

cd dir1
(execute on foo)
cd ../dir2
(execute on foo)
cd ../dir3
(execute on foo)

必须从每个目录中执行命令。 foo是一个批处理调度脚本(对于HTCondor,如果您想知道的话),并且必须在每个子目录中执行,以便由调度脚本启动的运行的输出将最终在每个子目录中。

问题“ 查找文件,并在文件的目录执行命令 ”,据我所知,并没有回答我的问题。该问题的第一个答案更多是一种变通办法,在我的情况下将不起作用,第二个答案没有足够的解释让我知道如何使用它。


@roaima,请解释它是如何重复的。这个问题的第一个答案对我没有帮助,更多的是解决,第二个答案对我来说没有任何意义。我需要更多的解释才能知道如何使用它。
NeutronStar '16

Answers:


23

假设您find支持它,请使用-execdir选项代替-exec

find * -name 'foo' -execdir pwd \;

如果没有,请提供您的平台和/或发行版本的详细信息(视情况而定)。


当你开始打“发现:相对路径” ./node_modules/.bin'被包含在PATH环境变量”:askubuntu.com/questions/621132/...
西罗桑蒂利冠状病毒审查六四事件法轮功

抱歉,我可能会这样写,但是-execdir(在Ubuntu上)很糟糕,因为它不给您{},而是给您的父母{}
无人机

1
@uav不知道您的用例,我无能为力。但是,根据您的要求,文档明确指出“ Like -exec,但是指定的命令是从包含匹配文件的子目录中运行的 ”。
roaima

是的,对,如果您正在寻找-type d(= directory),然后它不是最佳选择,这是一种特殊情况。
无人机

不知道您的用例,我无能为力。
roaima

4

假设您确切知道要在其中运行命令的目录,

for dir in dir1 dir2 dir3; do
    ( cd "$dir" && somecommand foo )
done

或者,遍历foo文件,

for foo in */foo; do
  ( cd "${foo%/*}" && somecommand foo )
done

子外壳程序可防止cd影响子脚本其余部分的工作目录。该${foo%/*}参数替换拓展到了该目录名foo文件生命(删除后的最后一切/的价值$foo)。

使用standard find执行相同的操作(如果foo文件可能位于目录结构的最深处):

find . -type f -name foo -exec sh -c '
    for foo do
        ( cd "${foo%/*}" && somecommand foo )
    done' sh {} +

换句话说:在当前目录中或以下的任何位置查找所有名为“ foo”的常规文件,并分批将其路径名指定给该Shell脚本。Shell脚本应遍历给定的路径名​​,将目录更改为每个路径名的目录部分,如果成功,则执行somecommand foo

有关使用非标准解决方案的信息-execdir,请参见roaima的答案。他的回答适合我的例子:

find . -type f -name foo -execdir somecommand foo ';'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.