最好的方法在目录树中的每个文件上运行命令


Answers:


13
find . -exec <command> {} \;

将当前目录作为树的根或一般而言:

find <directory> -exec <command> {} \;

4
在某些系统上,find没有-exec选项,您可以使用find。| xargs <Command>
Hemant 2010年

4
确实,如果您需要按内容进行过滤,请尝试-name "*.c"或例如-type d针对目录进行筛选

Find可以完成非常复杂的事情-您可能需要查看手册页-unixhelp.ed.ac.uk/CGI/man-cgi?find-有关完整的选项列表。
卢卡斯·琼斯

您可能还需要注意带空格的文件名,这可能会破坏-exec和xargs方法。参见tinyurl.com/ygvgmw5
肖恩·

如果可能,请使用find ... | xargs ...成语,它成批处理文件,这通常会更快(启动较少的进程)。
vonbrand 2013年

5

如果-print0要查找的文件名或目录名带有空格,请使用该选项来查找和-0选择xargs

find {dir} -print0 | xargs -0r {command}

-print0选项发现打印出的文件名作为NUL-分隔,而不是空格隔开的列表,而-0选项xargs指示它打破其输入NUL,而不是空白。由于NUL是Unix文件名中不允许使用的字符之一,因此无法将其误认为文件名的一部分。

-r选项在那里,因此xargs如果没有输入,则不会出现错误。


3

如果可移植性是一个问题,那么我将远离特定于shell的实现方式(很多人使用很多不同的shell,但总的来说,find和xargs是真正的基本工具,没人敢以根本的方式进行更改) 。

使用find和xargs的基本参数应该可以为您提供更可移植的解决方案。


2

如果可以将参数分组在一起,请查找| xargs可能会提供更好的性能,因为它执行命令的次数比find -exec少得多。如果要为每个文件每次执行命令或在文件的子目录中执行,则可能应使用find -exec或-execdir。

通常,最好远离特定于Shell的循环。在大多数情况下,find&xargs就足够了。


1

确保您使用的命令的版本没有递归操作的标志。:)


0
find [args] -print | xargs {command}

最适合我。


2
-1不适用于包含空格的文件名。更好地使用find -print0 | xargs -0。
starblue 2010年
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.