使用"找到... -delete"仅从特殊子目录中删除图像文件

时间:2015-09-30 16:08:07

标签: linux bash shell ubuntu-14.04 linuxmint

我需要清理音乐集中的一些子目录,以防止不需要的图像。我正在使用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

所以这是我的问题:

  • 为什么 -delete 不起作用?
  • 对于" extravaganza"这个命令是否真的安全喜欢路径和文件名中的空格,浮点字符和外来字符吗?
  • 如何使用 bash find 重写上述命令?
  • 是否可以优化命令(重新加速,安全,嵌套查找)?

在实际的集合中,命令必须遍历16899个文件夹,几乎所有文件夹都包含空格和外来字符(如捷克语,俄语,日语,希腊语,德语......),因此它必须是健壮的。

提前感谢任何见解和一些启示!

2 个答案:

答案 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执行命令之前检查命令。