如何使用 find 搜索具有特定扩展名的文件?

如何使用 find 搜索具有特定扩展名的文件?

我们想要找到.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(而不是谓词)切换到标准扩展正则表达式。

还有另一个标准谓词:-pathlike-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如果通配符不够,请使用,但请检查您需要定位的实现中的支持,并注意,正则表达式语法可能不同。如果您只需要匹配文件名,请确保不使用可以匹配/.

相关内容