为什么当我在末尾添加 -print0 时 find:s -or 会失败?

为什么当我在末尾添加 -print0 时 find:s -or 会失败?

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

所以我开始查找文件

find -iname *.mov -or -iname *.mkv -or -iname *.avi

他按照预期向我展示了一些每种类型的文件。

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

find -iname *.mov -or -iname *.mkv -or -iname *.avi -print0 | while read -d $'\0' line
do
    echo $line
done

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

这是怎么回事,我错过了什么?

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

答案1

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

find -iname '*.mov' -print0 -or -iname '*.mkv' -print0 -or -iname '*.avi' -print0

或者

find \( -iname '*.mov' -or -iname '*.mkv' -or -iname '*.avi' \) -print0

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

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

find如果您有此选项,则可以使用稍微简洁的形式:

find -iregex '.*\.\(mov\|mkv\|avi\)$' -print0

-type f(如果您发现自己使用这些扩展名命名目录,您可能需要添加。)

相关内容