我正在编写一个小脚本来修改目录树中的一些电影,我想用 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
,以防您发现自己使用这些扩展名命名目录。)