【发布时间】:2023-03-24 06:11:01
【问题描述】:
我需要从不需要的图像中清除我的音乐收藏中的一些子目录。我正在使用 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]”的文件夹只能分别出现在“Artist”文件夹的下方;所以最多两层深。
我想出了以下查找命令:
$ 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.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
所以这是我的问题:
- 为什么 -delete 不起作用?
- 对于路径和文件名中的空格、全局字符和外来字符等“夸张”,此命令真的安全吗?
- 我将如何重写上述命令,仍然使用 bash 和 find?
- 能否优化命令(重新速度、安全、嵌套查找)?
在实际集合中,该命令必须遍历16899个文件夹,几乎所有文件夹都包含空格和外来字符(如捷克语、俄语、日语、希腊语、德语……),所以它必须是健壮的。
提前感谢您的任何见解和启发!
【问题讨论】:
-
在
find命令中包含find命令很奇怪...无论如何,您的删除仅适用于-iname '*.png'谓词,因为您错过了一些分组。要检查会发生什么,请将-delete谓词替换为-print谓词。你会看到find错过了所有的jpg。使用分组:\( -iname '*.jp*g' -or -iname '*.png' \) -
@gniourf_gniourf 我真的想不出用一个
find命令来做到这一点的方法。我认为find-from-find是正确的方法。不过,您对分组很了解;您应该将其发布为答案。 -
感谢 gniourf_gniourf!我只是想出了同样的想法,经过更多的实验。是的,请把它作为答案发布,我很高兴接受你的而不是我的 ;-)
标签: linux bash shell ubuntu-14.04 linux-mint