使用 -delete 时,Find 命令不会删除任何内容

使用 -delete 时,Find 命令不会删除任何内容

我正在使用这个脚本:

find $convfold -name \*.mkv -o -name \*.avi -o -name \*.mov -o -name \*.wmv -o -name \*.m4p -o -name \*.m4v -o -name \*.mpg -o -name \*.mp2 -o -name \*.mpeg -o -name \*.mpe -o -name \*.mpv -o -name \*.m2v -o -name *.m4v -delete

其中$convfold是我要删除视频的文件夹的变量。

如果我-delete从代码中删除它,它会显示应该删除的文件,但是当我在代码中拥有它时,我不会收到任何返回错误或异常。

例子:

flynn@Tron:~/FilebotHandbrake/testconverting$ find -name \*.mkv -o -name \*.mp4 -o -name \*.avi 
./TV Shows/Mr. Robot/Season 02/Mr. Robot - S02E02 - eps2.0_unm4sk-pt2.tc.mkv
./TV Shows/Mr. Robot/Season 02/Mr. Robot - S02E01 - eps2.0_unm4sk-pt1.tc.mkv

任何帮助或建议都将不胜感激。

答案1

问题是,对于find,逻辑与的约束比逻辑或的约束更紧密。观察:

$ ls
file1  file2  file3  file4
$ find . -name \*1 -o -name \*2 -exec echo {} \;
./file2

在上面,-name \*2-exec echo {} \;通过隐含的逻辑与绑定在一起。此逻辑与的绑定性比将-o第一个-name与第二个连接的逻辑或更强。

为了避免这种情况,您需要使用括号进行分组:

$ find . \( -name \*1 -o -name \*2 \) -exec echo {} \;
./file1
./file2

或者,完整的命令如下:

find $convfold \( -name \*.mkv -o -name \*.avi -o -name \*.mov -o -name \*.wmv -o -name \*.m4p -o -name \*.m4v -o -name \*.mpg -o -name \*.mp2 -o -name \*.mpeg -o -name \*.mpe -o -name \*.mpv -o -name \*.m2v -o -name *.m4v \) -delete

文档

man find

请注意,-a当隐式指定时(例如,两个测试之间没有显式运算符),或显式指定优先级高于-o。这意味着 find . -name afile -o -name bfile -print 永远不会打印文件。

相关内容