终端 - 删除所有不包含 .mp3 文件的文件夹

5
我正在Linux上使用Banshee,让它自动组织我的音乐收藏并形成文件夹层次结构。当我向音乐文件夹添加新专辑时,Banshee会自动移动(并重命名)mp3文件,并将它们放入正确的艺术家文件夹中。如果文件夹中没有其他文件,则该文件夹也会被删除,但如果存在其他文件,则仅移动mp3文件,文件夹保留不变。因此,我的音乐文件夹中有许多只包含图像文件或类似辅助文件的文件夹。
如何删除任何没有mp3文件的文件夹(位于音乐文件夹内)?
例如,假设我有以下内容:
/home/user/Music/

我添加了一个名为“Album 1 (2010)”的文件夹,其中包含MP3和封面艺术品。Banshee将提取MP3并将它们放在正确的艺术家文件夹中,例如:

/home/user/Music/Artist

但是文件夹

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

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

我认为答案将是一个命令行的解决方案,但我也接受任何建议。此外,最好需要确认...以防万一。

4个回答

3

基于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而不是.mp3。这个脚本展示了所有这些文件以及我正在寻找的非mp3文件。 - Richard Martinez
哦,你可能想使用-iname来匹配不区分大小写的名称。我已经编辑好了。由于Shell没有执行任何实际的glob,因此Shell中的各种glob选项应该是无关紧要的,所以我已将其删除。 - Ken Bloom
是的,“-iname”开关解决了大写MP3扩展名的问题。我以前见过glob选项,最好去谷歌一下它们... - Richard Martinez
这个答案的修改形式也在U&L上提供了:http://unix.stackexchange.com/questions/98469/find-directories-without-music-files/98472#98472 - slm

2

首先删除非mp3文件以避免空文件夹中有jpg文件。

执行以下命令:find ! -iname '*.mp3' -type f -delete

如果您想要删除空文件夹,请执行以下操作:

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

1

目前无法评论,但是@ghostdog74的查找命令会检查当前目录中的mp3文件以及实际子目录,如果/home/user/Music中没有松散的mp3文件,则会删除整个树。

如果这些是完全空的目录,则rmdir *将不需要任何脚本即可完成操作:rmdir无法删除其中包含文件或目录的文件。

为了处理空格,请在命令的顶部或shell中首先运行IFS=$(echo -en "\b\n")。这可以防止变量在包含空格的情况下扩展为多个参数。如果您在shell中执行此操作,则可能需要执行类似于SAVEIFS=$IFS; IFS=...; do stuff; IFS=$SAVEIFS的操作,以便您可以恢复原始设置,或者只需关闭终端并打开一个新的终端以获取新的环境。


这更适合作为对ghostdog74答案的评论。 - Ken Bloom

0
#! /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 }

等一下……这对于文件夹名字里有空格的情况不行……让我试试引号。 - Richard Martinez
我现在已经编辑过来解决了我的问题。(不确定-depth选项是否有帮助,因为我没有测试它。) - Ken Bloom
@Ken,为什么你要编辑我的帖子,增加另一层冗余而没有测试? - ghostdog74
因为我同时在测试您添加的-depth选项。现在我刚刚测试了一下,如果没有第二个find命令,它就无法正常工作。 - Ken Bloom
@Ken,如果你再放一个没有maxdepthfind,它会再次遍历目录!而且没有必要再放第二个find。请不要再编辑帖子了。在OP使用后告诉我他的问题之后,我宁愿自己编辑它。 - ghostdog74
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接