【问题标题】:Create a bash script to delete folders which do not contain a certain filetype创建一个 bash 脚本来删除不包含特定文件类型的文件夹
【发布时间】:2014-02-19 00:53:44
【问题描述】:

我最近遇到了一个问题。

我使用一个实用程序将我所有的音乐文件移动到基​​于标签的目录中。这留下了很多几乎个空文件夹。通常,这些文件夹包含 thumbs.db 文件或专辑封面的某种图像。 mp3 在它们的新目录中有正确的专辑封面,所以旧的可以删除。

基本上,我需要在 D:/Music/ 中找到任何目录:

-没有任何子目录

-不包含任何mp3文件

然后删除它们。

我认为这在 shell 脚本或 bash 脚本或任何其他 linux/unix 世界中比在 Windows 8.1 (HAHA) 中更容易。

有什么建议吗?我写这样的脚本不是很有经验。

【问题讨论】:

  • 我建议您在试验这样的脚本时要非常小心。您可能需要在开始之前备份所有内容。
  • @Beta 我计划在删除任何内容之前使用查找并保存到文本文件来查看脚本正在删除的确切内容。不过谢谢,我确实备份了我的整个音乐目录,以防万一:)
  • Linux 还是 Windows?路径 D:/Music/ 仅在 Windows 上。
  • @BMW Linux。抱歉,我主要使用 Windows。当驱动器安装在Ubuntu中时,我相信linux目录是/media/justin/"Local Disk"/Music

标签: linux bash shell


【解决方案1】:

这应该让你开始

find /music -mindepth 1 -type d |
while read dt
do
  find "$dt" -mindepth 1    -type d | read && continue
  find "$dt" -iname '*.mp3' -type f | read && continue
  echo DELETE $dt
done

【讨论】:

    【解决方案2】:

    这是短篇小说...

    find . -name '*.mp3' -o -type d -printf '%h\n' | sort | uniq > non-empty-dirs.tmp
    find . -type d -print | sort | uniq > all-dirs.tmp
    comm -23 all-dirs.tmp non-empty-dirs.tmp > dirs-to-be-deleted.tmp
    
    less dirs-to-be-deleted.tmp
    
    cat dirs-to-be-deleted.tmp | xargs rm -rf
    

    请注意,在删除所有递归空目录之前,您可能需要运行所有命令几次(取决于存储库的目录深度)...

    说来话长……

    你可以从两个基本的角度来解决这个问题:要么找到所有目录,然后遍历每个目录,检查它是否包含任何 mp3 文件或任何子目录,如果不包含,则标记该目录以删除。它可以工作,但在大型非常大的存储库上,您可能需要很长的运行时间。

    另一种在我看来更有趣的方法是构建一个不被删除的目录列表,然后从所有目录的列表中减去该列表。让我们执行第二种策略,一次一步...

    首先,要找到所有包含mp3文件的目录的路径,你可以这样做:

    find . -name '*.mp3' -printf '%h\n' | sort | uniq
    

    这意味着“找到任何以 .mp3 结尾的文件,然后打印其父目录的路径”。

    现在,我当然可以列举至少十种不同的方法来查找包含至少一个子目录的目录,但是保持与上述相同的策略,我们可以轻松获得...

    find . -type d -printf '%h\n' | sort | uniq
    

    这意味着:“找到任何目录,然后打印到它的父目录的路径。”

    这两个查询可以在一次调用中组合,生成一个列表,其中包含所有不被删除的目录的路径。让我们将该列表重定向到一个临时文件。

    find . -name '*.mp3' -o -type d -printf '%h\n' | sort | uniq > non-empty-dirs.tmp
    

    让我们类似地生成一个包含所有目录路径的文件,无论它们是否为空。

    find . -type d -print | sort | uniq > all-dirs.tmp
    

    所以,一方面,我们有所有目录的完整列表,另一方面,还有不被删除的目录列表。现在怎么办?有很多策略,但这里有一个非常简单的策略:

    comm -23 all-dirs.tmp non-empty-dirs.tmp > dirs-to-be-deleted.tmp
    

    一旦你有了它,那么,查看它,如果你满意,然后通过 xargs 将它通过管道传递到 rm 以实际删除目录。

    cat dirs-to-be-deleted.tmp | xargs rm -rf
    

    【讨论】:

    • 非常感谢。我正在学习计算机科学,因此非常感谢您的解释。我想我本可以得出这个的逻辑,但是上帝我不擅长脚本。谢谢!
    • 编辑:我运行了这个,虽然逻辑是有道理的,但它发现要删除的目录非常不正确。 ://
    猜你喜欢
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    相关资源
    最近更新 更多