我们想要找到.hprof
./var
有什么区别
find /var -type f -regex '.*\.hprof'
/var/ff-efre-ferg-fr.hprof
和
find /var -type f -name "*.hprof"
/var/ff-efre-ferg-fr.hprof
或者说搜索的方式是完全一样的?
答案1
谓词-name
是标准的,仅与文件名匹配并使用 shell 通配符语法。
这-regex
是一个非标准扩展,由一些find
实现支持,但具有不同的语法并匹配完整路径(从此处提供的路径参数开始/opt
)。
默认语法是某种形式的正则表达式。例如,对于 GNU find
,即 GNUemacs
正则表达式,您可以在-regextype
谓词中使用不同的正则表达式类型。对于某些 BSD,它是标准的基本正则表达式,您可以使用选项-E
(而不是谓词)切换到标准扩展正则表达式。
还有另一个标准谓词:-path
like-regex
匹配完整路径并且like-name
使用shell 通配符。
一些实现还支持一些-iname
, -ipath
,-iregex
谓词来匹配不区分大小写。 GNUfind
支持-wholename
作为-path
(rms 对象到单词小路指的是包含一些目录组成部分的完整文件名)。
find /opt -type f -regex '.*\.hprof'
和
find /opt -type f -path '*.hprof'
与支持-regex
.通配符*
和正则表达式(所有变体).*
都意味着任意数量的字符。
他们可能会给出不同的结果
find /opt -type f -name '*.hprof'
对于路径组件(名称除外)包含在区域设置中不形成有效字符的字节序列的文件。
$ mkdir $'St\351phane'
$ touch $'St\351phane/file.hprof'
$ locale charmap
UTF-8
$ find . -regex '.*\.hprof'
$ find . -path '*.hprof'
$ find . -name '*.hprof'
./St?phane/file.hprof
这是一个Stéphane
目录,但编码é
为 iso8859-1 (0351, 0xe9),而不是 UTF-8。在 UTF-8 语言环境中,该 0xe9 字节不会映射到字符,因此正则表达式.
或通配符*
与其不匹配(至少对于 GNU 而言find
)。不过,文件的基本名称 ( file.hprof
) 是可以的,因此-name
能够匹配它。
最大化便携性和可靠性的一些经验法则:
-name
当您只需要匹配文件名而不是它所在的目录(通配符语法就足够了)时使用,就像这里的*.hprof
扩展名搜索一样。-path
如果您还需要匹配文件所在的位置(例如find . -path ./special-dir -prune -o -type f -print
)(并且通配符语法就足够了),请使用。-regex
如果通配符不够,请使用,但请检查您需要定位的实现中的支持,并注意,正则表达式语法可能不同。如果您只需要匹配文件名,请确保不使用可以匹配/
.