繁体   English   中英

使用“find ... -delete”仅从特殊子目录中删除图像文件

[英]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

所以这里是我的问题:

  • 为什么-delete不起作用?
  • 这个命令对于路径和文件名中的空格、全局字符和外来字符等“盛会”真的安全吗?
  • 我将如何重写上述命令,仍然使用bashfind
  • 能否优化命令(重新速度、安全性、嵌套查找)?

在实际集合中,该命令要遍历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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM