通过类似的 find 命令对“@eadir”目录的读取不一致

通过类似的 find 命令对“@eadir”目录的读取不一致

A)这将递归输出所有*.JPG*.flac文件:

$ find . -type f -name "*.JPG" -o -name "*.flac"

Output includes: 1 JPG document and 254 flac documents

B) 这将仅*.flac递归输出文件:

$ find . -type f -name "*.flac"

Output includes: 218 flac documents

我假设*.flac用这两个命令列出的所有文件都将与每个命令匹配完全相同数量的文件。唯一的区别是第一个命令将包含*.JPG在所有 *.flac 文件之上,对吧?不完全是。如果您是 iTunes 用户,您可能熟悉@eadir目录。令人惊讶的是,第一个命令甚至会包含*.flac这些目录中的文件@eadir(36 个*.flac文件),但第二个命令不会。

为什么这两个命令对于相同的文件类型返回不同的结果?

答案1

find . -type f -name "*.JPG" -o -name "*.flac"查找至少符合-o以下条件之一 ( ) 的文件:

  • -type f名称以.JPG( ) 结尾的常规文件 ( ) -name "*.JPG"
  • 文件(任何类型的) 其名称以.flac( -name "*.flac") 结尾。

find . -type f -name "*.JPG" -o -name "*.flac"相当于find . \( -type f -name "*.JPG" \) -o \( -name "*.flac" \).用更正式的术语来说,并置(意思是“和”)比-o运算符(意​​思是“或”)结合得更紧密。

这些@eadir目录显然包含非常规文件,可能是符号链接。第一个命令返回但第二个命令不返回的文件.flac不是常规文件。您可以使用以下命令查看它们是什么:

find . ! -type f -name "*.flac" -exec ls -ld {} +

相关内容