Linux命令:查找文件并在其上运行命令


16

如何设法找到目录和子目录中的所有文件并对其运行命令?

例如,

find . -type f -name "*.txt" 

查找所有txt文件,并:

find . -type f -name "*.txt" | gedit

将其发送到gedit,但在文本文件中。我希望gedit打开所有文本文件。

Answers:


22

您可以使用该-exec标志在每个匹配文件上执行命令:

$ find ./ -type f -name "*.txt" -exec gedit "{}" \;

句法

语法有点奇怪(-exec command ;有关更多信息,请参见手册页):

The string `{}' is replaced by the current file name being processed

您可能还需要考虑-execdir,它会执行相同的操作,但是从包含匹配文件的子目录中执行命令(通常更可取)。


1
谢谢。我看到它有效。但是结尾(“ {}” \ :)是什么意思?执行清单?

1
{}当前文件名的代表,分号只是终止命令。反斜杠和周围的引号只是为了防止外壳扩展。
David Cain

5

find . -type f -name "*.txt" -print0 | xargs -0 gedit


谢谢。我看到它有效。但是-print0是什么?xargs -0部分意味着什么?

1
@xyz,您可以使用手册页了解任何 UNIX命令的标志。尝试man findman xargs,然后/搜索给定的标志。该文档非常好,它可以回答您的问题。
David Cain

1
-print0在每个条目之后打印一个NULL字符,-0期望条目以NULL字符分隔。这是处理棘手名称的最安全方法。
Notinlist,2013年

语法不是gedit xargs -0而不是xargs -0 gedit也不奇怪。我看到前者不起作用,但是看不出原因。

3
由于性能原因,xargs比-exec更可取,因为xargs在传递给gedit之前可以“分批”许多参数。如果需要对每个文件分别运行gedit,请替换为'... -print0 | xargs -0 gedit'和'... -print0 | xargs -0 -i gedit {}'xargs是诸如find和screen之类的命令之一,在学习了一年之后,您永远都不知道自己的相处方式。
arclight 2014年
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.