terminal – 删除不包含.mp3文件的所有文件夹

我在Linux上使用Banshee,我有它在文件夹层次结构中自动组织我的音乐collections。 当我添加一个新的专辑到我的音乐文件夹,Banshee自动移动(和重命名)的MP3,并把它们放入正确的艺术家文件夹。 如果文件夹中没有其他文件,则该文件夹也被删除,但是如果存在其他文件,则只有mp3被移动,并且文件夹保持不变。 正因为如此,我的音乐文件夹里面有许多文件夹,里面没有mp3,只有图像文件或类似的辅助文件。

我将如何去除任何没有mp3文件的文件夹(在音乐文件夹内)?

例如,假设我有以下内容:

/home/user/Music/ 

我添加了文件夹“专辑1(2010)”,它有mp3和封面艺术。 Banshee会把mp3放到正确的艺术家文件夹里,说:

 /home/user/Music/Artist 

但接下来的文件夹

 /home/user/Music/Album 1 (2010) 

仍然存在。 我如何检查这个文件夹是否有mp3,如果没有,删除它?

我想答案将是一个命令行,但我打开任何build议。 另外,可能需要确认以防万一。

根据ghostdog74的回答:

 #! /bin/bash find -depth -type d | while read -r D do v=$(find "$D" -iname '*.mp3') case "$v" in "" ) echo "$D no mp3" # rm -fr "$D" #uncomment to use ;; esac done 

我们来测试一下目录结构

 . ./deleteme ./save2 ./save2/x.MP3 ./save-recursive ./save-recursive/nested ./save-recursive/nested/x.mp3 ./save ./save/x.mp3 

输出是:

 ./deleteme no mp3 

首先删除不是MP3文件,以jpg文件狂热空文件夹。

找 ! -iname'* .mp3'-type f -delete

如果你不会删除空文件夹

 find -depth -type d -empty -exec rmdir {} \; 

不能评论,但@ ghostdog74的查找命令除了实际的子目录之外还检查当前目录中的mp3,如果/ home / user / Music中没有mp3,它将删除整个目录树。

如果这些目录是完全空的,那么rmdir *将会在不需要任何脚本的情况下执行这个技巧:rmdir不能删除其中包含文件的文件或目录。

要处理空格,请先在命令顶部或在shell中运行IFS=$(echo -en "\b\n") 。 这可以防止当变量包含空格时变量扩展为多个参数。 如果你在shell中这样做,你可能会想要做一些像SAVEIFS=$IFS; IFS=...; do stuff; IFS=$SAVEIFS SAVEIFS=$IFS; IFS=...; do stuff; IFS=$SAVEIFS SAVEIFS=$IFS; IFS=...; do stuff; IFS=$SAVEIFS以便您可以恢复原来的设置,或者关闭终端并打开新的终端以获得全新的环境。

 #! /bin/bash shopt -s nullglob shopt -s nocaseglob find -depth -type d | { while read -r D; do case "$D" in "$DR" ) continue;; esac v=$(echo "$D"/*.mp3) case "$v" in "" ) echo "$D no mp3, to be deleted";; # rm -fr "$D" #uncomment to use *) DR=${D%/*} ;; esac done }