![使用 -delete 时,Find 命令不会删除任何内容](https://linux22.com/image/1505253/%E4%BD%BF%E7%94%A8%20-delete%20%E6%97%B6%EF%BC%8CFind%20%E5%91%BD%E4%BB%A4%E4%B8%8D%E4%BC%9A%E5%88%A0%E9%99%A4%E4%BB%BB%E4%BD%95%E5%86%85%E5%AE%B9.png)
我正在使用这个脚本:
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
永远不会打印文件。