如何使用Groovy清理你的音乐目录中不需要的文件

180 阅读3分钟

在这个演示中,我为删除相册目录中不需要的文件提供了便利。

在这个系列中,我正在开发几个脚本来帮助清理我的音乐收藏。在上一篇文章中,我们用创建的框架来分析音乐文件的目录和子目录,检查以确保每张专辑都有一个cover.jpg ,并记录任何其他不是FLAC、MP3或OGG的文件。

我发现了一些明显可以被删除的文件--我看到奇怪的foo ,还有一堆PDF、PNG和JPG,都是专辑封面。考虑到这一点,并考虑到清除杂物的任务,我提供了一个改进的脚本,它使用Groovy地图来记录文件名和它们出现的次数,并以CSV格式打印。

开始用Groovy进行分析

他们会确保你了解我的音乐目录的预定结构,那篇文章中创建的框架,以及如何拾取FLAC、MP3和OGG文件。在这篇文章中,我便于删除专辑目录中不需要的文件。

框架和专辑文件的分析位

从代码开始。和以前一样,我在脚本中加入了注释,反映了我通常给自己留下的(相对简略的)"注释说明"。

1        // Define the music libary directory
2        // def musicLibraryDirName = '/var/lib/mpd/music'
3        // Define the file name accumulation map
4        def fileNameCounts = [:]
5        // Print the CSV file header
6        println "filename|count"
7        // Iterate over each directory in the music libary directory
8        // These are assumed to be artist directories
9        new File(musicLibraryDirName).eachDir { artistDir ->
10            // Iterate over each directory in the artist directory
11            // These are assumed to be album directories
12            artistDir.eachDir { albumDir ->
13                // Iterate over each file in the album directory
14                // These are assumed to be content or related
15                // (cover.jpg, PDFs with liner notes etc)
16                albumDir.eachFile { contentFile ->
17                    // Analyze the file
18                    if (contentFile.name ==~ /.*\.(flac|mp3|ogg)/) {
19                        // nothing to do here
20                    } else if (contentFile.name == 'cover.jpg') {
21                        // don't need to do anything with cover.jpg
22                    } else {
23                        def fn = contentFile.name
24                        if (contentFile.isDirectory())
25                            fn += '/'
26                        fileNameCounts[fn] = fileNameCounts.containsKey(fn) ?  fileNameCounts[fn] + 1 : 1
27                    }
28                }
29            }
30        }
31        // Print the file name counts
32        fileNameCounts.each { key, value ->
33            println "$key|$value"
34        }

这是对原始框架的一组相当直接的修改。

第3-4行定义了fileNameCount ,一个用于记录文件名计数的地图。

第17-27行分析文件名。我避免任何以.flac.mp3.ogg 结尾的文件,以及cover.jpg 文件。

第23-26行记录文件名(作为fileNameCounts 的键)和计数(作为值)。如果该文件实际上是一个目录,我会附加一个/ ,以帮助在删除过程中处理它。注意第26行,Groovy映射,像Java映射一样,需要在递增值之前检查键的存在,这与例如awk编程语言不同。

就这样吧!

我按如下方式运行。

$ groovy TagAnalyzer4.groovy > tagAnalysis4.csv

然后,我通过导航到工作表菜单并选择从文件插入工作表,将生成的CSV加载到LibreOffice电子表格中。我将分隔符设为&$124;

Image of a screenshot of LibreOffice Calc tht shows tagAnalysis

我按照列数的递减顺序对其进行了排序,以强调屡教不改者。还要注意的是,在第17-20行,有一堆提及专辑名称的M3U文件,可能是由一些用心良苦的翻录程序创建的。我还看到,在更远的地方(未显示),像fixfixtags.sh 这样的文件,证明以前曾努力清理一些问题,并在这个过程中留下了其他垃圾。我使用find 命令行工具来摆脱其中的一些文件,大致是这样的。

$ find . \( -name \*.m3u -o -name tags.txt -o -name foo -o -name .DS_Store \
-o -name fix -o -name fixtags.sh \) -exec rm {} \;

我想我也可以用另一个Groovy脚本来做这个。也许下一次吧。