为什么在最后添加 -print0 时 find:s -or 会失败?

Joh*_*han 4 find

我正在编写一个小脚本来修改目录树中的一些电影,我想用 bash for 循环或类似方法解析该树。

所以我开始寻找文件

find -iname *.mov -or -iname *.mkv -or -iname *.avi
Run Code Online (Sandbox Code Playgroud)

他按预期向我展示了各种文件。

但是然后我尝试用这个循环结果(因为某些目录名称中有空格)。

find -iname *.mov -or -iname *.mkv -or -iname *.avi -print0 | while read -d $'\0' line
do
    echo $line
done
Run Code Online (Sandbox Code Playgroud)

但现在他只返回avi文件!所以当我添加 -print0 时,他似乎忽略了我的 -or 和另一个 -iname。

这里发生了什么,我错过了什么?

在循环结果之前,我是否需要将 find 的结果发送到 tmpfile 中?

Mat*_*Mat 10

-print0操作仅将其自身附加到最后一个测试(-iname *.avi在本例中)。为每个匹配重复打印操作,或进行一些分组。

find -iname '*.mov' -print0 -or -iname '*.mkv' -print0 -or -iname '*.avi' -print0
Run Code Online (Sandbox Code Playgroud)

或者

find \( -iname '*.mov' -or -iname '*.mkv' -or -iname '*.avi' \) -print0
Run Code Online (Sandbox Code Playgroud)

并小心那些*- 来自find手册页:

请注意,您理所当然地应该引用模式,否则 shell 将扩展其中的任何通配符。

如果你find有这个选项,一个稍微更简洁的形式:

find -iregex '.*\.\(mov\|mkv\|avi\)$' -print0
Run Code Online (Sandbox Code Playgroud)

(并且您可能想要添加-type f,以防您发现自己使用这些扩展名命名目录。)