我需要清理音乐集中的一些子目录,以防止不需要的图像。我正在使用Ubuntu 14.04和/或Linux Mint 17.2以及使用 find 命令的bash shell脚本。
目录结构(最小示例)如下:
Tagged
Artist #1
Artist #1 - An Album
Artist #1 - A Track.flac
cover.jpg
something.png
Artist #1 - [compilations]
Artist #1 - A Track.flac
cover.jpg
something.png
Artist #2
Artist #2 - Another Album
Artist #2 - A Track.mp3
cover.jpg
在" [compilations]"结尾的子文件夹中仅,我想删除所有类型的jpeg和/或png图像(因为标记软件错误地将它们放在那里)。任何恰好位于正常"专辑中的图像"我希望保留文件夹。
使用我的目录结构,文件夹包含" [compilations]"在名称中只能发生在"艺术家"文件夹,分别;所以最多有两个级别。
我想出了以下find命令:
$ cd Tagged
$ find . -maxdepth 2 -type d -name '*\[compilations\]' -exec find {} -type f -iname '*.jp*g' -or -iname '*.png' -delete \;
这似乎做了一些事情需要一段时间,但文件" ./艺术家#1 /艺术家#1 - [编辑] /cover.jpg" 和" ./艺术家#1 /艺术家#1 - [编辑] /something.png" 仍然存在(以及所有其他图像文件)。
对Linux很新,我假设我使用查找的 -delete 选项犯了一个愚蠢的错误,因为以下命令(不带 -delete )正确显示文件:
$ find . -maxdepth 2 -type d -name '*\[compilations\]' -exec find {} -type f -iname '*.jp*g' -or -iname '*.png' \;
./Artist #1/Artist #1 - [compilations]/cover.jpg
./Artist #1/Artist #1 - [compilations]/something.png
所以这是我的问题:
在实际的集合中,命令必须遍历16899个文件夹,几乎所有文件夹都包含空格和外来字符(如捷克语,俄语,日语,希腊语,德语......),因此它必须是健壮的。
提前感谢任何见解和一些启示!
答案 0 :(得分:1)
经过一些实验,我认为我的错误是没有将OR&#39; ed部分放在括号中 - 似乎 find 使用 -delete < / em>仅在最后一个OR 的右侧部分,即尝试删除&#39; *。png&#39;。唉,几乎我所有的封面图片都是&#39; *。jpg&#39;所以我认为它根本不起作用!
所以我认为纠正的命令应该是:
$ find . -depth -maxdepth 2 -type d -name '*\[compilations\]' -exec find {} -type f \( -iname '*.jp*g' -or -iname '*.png' \) -delete \;
它似乎在我上面的测试用例中正常工作。
然而,一些确认会很好。也许是我的其他问题的一些答案,仅供参考和学习。 谢谢!
答案 1 :(得分:1)
您的-delete
谓词仅适用于
-iname '*.png'
谓词,因为你错过了分组:当你给find
以下内容时:
-type f -iname '*.jp*g' -or -iname '*.png' -delete
由于布尔运算符的优先级,find
理解:
\( -type f -iname '*.jp*g' \) -or \( -iname '*.png' -delete \)
要解决此问题,请使用:
-type f \( -iname '*.jp*g' -or -iname '*.png' \) -delete
我建议您尝试将-delete
替换为-print
:您会看到-delete
适用的内容!
现在,关于嵌套的find
:由于目录树的结构(您的文件只在深度3中),您应该只能使用find
的一个实例:< / p>
find -maxdepth 3 -path '*/*\[compilations\]/*' \( -iname '*.jp*g' -o -iname '*.png' \) -type f -print
(我将-print
代替-delete
,以便您可以在使用-delete
执行命令之前检查命令。