这是一个简短的故事...
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
D:/Music/
仅适用于Windows。 - BMW/media/justin/"Local Disk"/Music
。 - user2133809