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 {} +