如何在找到文件的地方执行命令?
考虑我有一个名为的目录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 file
为echo {}
和/或来看到这一点pwd
。
从联机帮助页:
-execdir command ;
-execdir command {} +
类似
-exec
,但指定的命令是从包含匹配文件的子目录运行的,该子目录通常不是您启动的目录find
。