Linux 命令:查找文件并对它们运行命令

xyz*_*xyz 26 linux command-line

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

例如,

find . -type f -name "*.txt" 
Run Code Online (Sandbox Code Playgroud)

查找所有 txt 文件并:

find . -type f -name "*.txt" | gedit
Run Code Online (Sandbox Code Playgroud)

将它发送到 gedit,但在文本文件中。我想让 gedit 打开所有文本文件。

Dav*_*ain 37

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

$ find ./ -type f -name "*.txt" -exec gedit "{}" \;
Run Code Online (Sandbox Code Playgroud)

句法

语法有点奇怪(-exec command ;有关更多信息,请参见联机帮助页):

The string `{}' is replaced by the current file name being processed
Run Code Online (Sandbox Code Playgroud)

您可能还想考虑-execdir,它会做同样的事情,但是从包含匹配文件的子目录中执行命令(这通常是可取的)。

  • `{}` 代表当前文件名,分号只是终止命令。反斜杠和周围的引号只是为了防止 shell 扩展。 (2认同)

Not*_*ist 8

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

  • `-print0` 在每个条目后打印一个 NULL 字符,`-0` 期望条目以 NULL 字符分隔。这是处理棘手名称的最安全方法。 (3认同)
  • 出于性能原因,xargs 比 -exec 更可取,因为 xargs 可以在将它们传递给 gedit 之前“批量处理”许多参数。如果需要对每个文件单独运行 gedit,请替换 '... -print0 | xargs -0 gedit' 与 '... -print0 | xargs -0 -i gedit {}' xargs 是诸如 find 和 screen 之类的命令之一,在您了解它之后的一年内,您永远不会知道自己是如何相处的。 (3认同)