shell 创建一个bash脚本来删除不包含特定文件类型的文件夹

3hvapo4f  于 2023-05-18  发布在  Shell
关注(0)|答案(3)|浏览(312)

我最近遇到了一个问题。
我用一个实用程序把我所有的音乐文件移动到目录的基础上标签。这留下了很多 * 几乎 * 空的文件夹。通常,这些文件夹包含thumbs.db文件或专辑封面的某种图像。mp 3s在他们的新目录中有正确的专辑艺术,所以旧的可以删除。
基本上,我需要在D:/Music/ that中找到任何目录:

  • 没有任何子目录
  • 不包含任何mp3文件
    然后删除它们。
    我认为这在shell脚本或bash脚本或其他linux/unix世界中比在Windows 8.1(HAHA)中更容易做到。
    有什么建议吗?我写这种剧本的经验不多。
baubqpgj

baubqpgj1#

这应该能让你开始

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
g52tjvyc

g52tjvyc2#

在这里发现问题,类似于@user2133809这些命令删除了必要的文件,而不是那些必须删除的文件。find命令可能有差异,可能并不总是成功列出属性。但是使用sed找到必要的文件扩展名帮助我管理形成包含我想保留的文件的目录列表。将上述解决方案与this solution相结合提供了一个清晰的管道来删除不需要的文件列表并安全地删除它们。我的工作脚本会像这样更改non-empty-dirs.tmp的创建:
find . -type f -name '*.mp3*' | sed -r 's|/[^/]+$||' |sort |uniq > non-empty-dirs.tmp
我没有足够的声誉@詹姆斯,但谢谢你分享这个简洁的答案。

n3ipq98p

n3ipq98p3#

这是个小故事

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

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

说来话长

你可以从两个基本的Angular 来处理这个问题:要么你找到所有的目录,然后遍历每个目录,检查它是否包含任何mp3文件或任何子目录,如果没有,标记该目录删除。它可以工作,但是在大型非常大的存储库上,您可能会期望相当长的运行时间。
另一种方法,在我看来更有趣,是构建一个不被删除的目录列表,并从所有目录列表中减去该列表。让我们做第二个策略,一步一个脚印…
首先,要找到包含mp3文件的所有目录的路径,你可以简单地做:

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

这意味着“找到任何以.mp3结尾的文件,然后打印到它的父目录的路径”。
现在,我可以列举至少10种不同的方法来查找包含至少一个子目录的目录,但保持上述策略相同,我们可以很容易地得到。

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

相关问题