[英]Using "find … -delete" to remove image files only from special subdirectories
我需要从不需要的图像中清除我的音乐收藏中的一些子目录。 我正在使用 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
仅在以“[编译]”结尾的子文件夹中,我想删除所有类型的 jpeg 和/或 png 图像(因为标记软件错误地将它们放在那里)。 任何碰巧在普通“相册”文件夹中的图像我也希望保留。
在我的目录结构中,名称中带有“[compilations]”的文件夹只能出现在“Artist”文件夹的正下方; 所以最多两层深。
我想出了以下 find 命令:
$ cd Tagged
$ find . -maxdepth 2 -type d -name '*\[compilations\]' -exec find {} -type f -iname '*.jp*g' -or -iname '*.png' -delete \;
这似乎做了一些事情并且需要一段时间,但是文件“./Artist #1/Artist #1 - [compilations]/cover.jpg”和“./Artist #1/Artist #1 - [compilations] /something.jpg”和“./Artist #1/Artist #1 - [compilations] /something.jpg” png”仍然存在(以及所有其他图像文件)。
作为 Linux 新手,我认为我使用find的-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个文件夹,几乎都包含空格和外来字符(如捷克语、俄语、日语、希腊语、德语……),所以它必须是健壮的。
在此先感谢您的任何见解和启发!
经过一些实验,我认为我的错误在于没有将 OR 部分放在括号中- 似乎find仅在最后一个 OR的右侧部分使用了-delete ,即试图删除“*.png”。 唉,几乎我所有的封面图片都是“*.jpg”,所以我认为它根本行不通!
所以我认为更正的命令应该是:
$ find . -depth -maxdepth 2 -type d -name '*\[compilations\]' -exec find {} -type f \( -iname '*.jp*g' -or -iname '*.png' \) -delete \;
它似乎在我上面的测试用例上正常工作。
尽管如此,一些确认会很好。 也许是我其他问题的一些答案,仅供参考和学习。 谢谢!
您的-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
一个实例:
find -maxdepth 3 -path '*/*\[compilations\]/*' \( -iname '*.jp*g' -o -iname '*.png' \) -type f -print
(我把-print
而不是-delete
以便您可以在使用-delete
执行之前检查命令)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.