在找到文件的地方执行命令

Pan*_*dya 7 find path command

如何在找到文件的地方执行命令?
考虑我有一个名为的目录testdir,其中包含以下内容:

$ ls -R testdir/
testdir/:
dir1  dir2  dir3  dir4  dir5

testdir/dir1:
doc1.pdf

testdir/dir2:
file1.txt

testdir/dir3:
doc2.pdf

testdir/dir4:
file2.txt

testdir/dir5:
doc5.pdf
Run Code Online (Sandbox Code Playgroud)

现在我想执行一个操作(执行一个命令)来find找到某个文件/文件类型。例如让我找到*.pdf

$ find . -name '*.pdf'
./testdir/dir3/doc2.pdf
./testdir/dir5/doc5.pdf
./testdir/dir1/doc1.pdf
Run Code Online (Sandbox Code Playgroud)

现在假设我想执行一个命令(例如 say touch file),上面的命令可以找到文件。换句话说,我想file在每个至少.pdf找到一个目录的目录中创建一个文件,以便我得到:

$ ls -R testdir/
testdir/:
dir1  dir2  dir3  dir4  dir5

testdir/dir1:
doc1.pdf  file

testdir/dir2:
file1.txt

testdir/dir3:
doc2.pdf  file

testdir/dir4:
file2.txt

testdir/dir5:
doc5.pdf  file
Run Code Online (Sandbox Code Playgroud)

我如何完成这样的工作?
可能是每次找到文件时,cd到文件所在的位置递归执行命令。
我知道它find有很棒的功能:-exec但我无法让它工作。


这只是让我了解我想做什么的一个例子。广义上:如何执行一个命令(通过find)递归找到文件?

roa*_*ima 11

如果您运行此命令,您touch file将在该命令启动的目录中运行,可能会多次运行:

find -name '*.pdf' -exec touch file \;
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您运行此变体,则命令的每个实例都将在目标文件的目录中运行:

find -name '*.pdf' -execdir touch file \;
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,您都可以通过将 替换touch fileecho {}和/或来看到这一点pwd


从联机帮助页:

-execdir command ;
-execdir command {} +

    类似-exec,但指定的命令是从包含匹配文件的子目录运行的,该子目录通常不是您启动的目录find