这两种在所有子目录中递归搜索文件的方法中,哪个更快/更好?
find . -regex ".*/.*abc.*"
Run Code Online (Sandbox Code Playgroud)
或者
find . | grep ".*abc.*"
Run Code Online (Sandbox Code Playgroud)
UNIX 文件名通常可以由八位字节(8 位字节)组成,除了 0x00 (NULL) 和 0x2F (/)。其他所有八位字节都是有效的。这包括诸如 0x0A(换行符)之类的好东西。
您的find
示例将正确处理带有奇怪字符(例如换行符)的文件名。
find | grep
当遇到这样的事情时,您的示例将给出奇怪和不正确的结果(它将一个名为“第 1 行\n 行 2”的文件视为两个文件)。
您可以使用find -print0 | grep -z
(如果您使用的是 GNU 版本,例如在 Linux 上);这将保持正确性。它会使用更多的内存。请注意,您可以使用该-regextype
选项告诉 find 使用扩展正则表达式(例如)。
如果你想做一些非常复杂的匹配,你可能会喜欢这个find2perl
脚本,它将一个find
命令行转换成一个简短的 perl 程序,然后你可以编辑以增加复杂性。
find . -regex ".*/.*abc.*"
更快,因为find . | grep ".*abc.*"
必须find
生成所有数据并将其传递给grep
. 不过差异可能很小。find . -regex ".*/.*abc.*"
也更可靠,因为即使在文件名带有空格的极少数情况下,它也能工作。
请注意,这两个命令都会查找完整路径包含abc
. 这不仅包括名称包含的文件,abc
还包括名称包含abc
, 递归的目录中的文件。要仅查找名称包含 的文件abc
,请使用
find -name '*abc*'
Run Code Online (Sandbox Code Playgroud)
在 ksh、bash 或 zsh 中,您可以echo **/*abc*
改为运行:**/
递归查看所有子目录。在 ksh 中,您需要先运行set -o globstar
(将其放入您的~/.kshrc
)。在 bash 中,你需要先运行shopt -s globstar
(把它放在你的~/.bashrc
)中。