Pulisci i file indesiderati nella tua directory musicale utilizzando Groovy
In questa dimostrazione, faciliterò la rimozione dei file indesiderati nelle directory degli album.
In questa serie sto sviluppando diversi script per aiutare a ripulire la mia raccolta musicale. Nell'ultimo articolo, abbiamo utilizzato il framework creato per analizzare la directory e le sottodirectory dei file musicali, controllando che ogni album abbia un file cover.jpg
e registrando eventuali altri file che non lo sono FLAC, MP3 o OGG.
Ho scoperto alcuni file che possono ovviamente essere eliminati (vedo qualche foo
in giro) e un mucchio di PDF, PNG e JPG che sono copertine di album. Con questo in mente, e pensando all'attività di rimozione dei cruft, offro uno script migliorato che utilizza una mappa Groovy per registrare i nomi dei file e il conteggio delle loro occorrenze e stamparli in formato CSV.
Inizia ad analizzare con Groovy
Se non l'hai già fatto, leggi i primi tre articoli di questa serie prima di continuare:
- Come analizzo la mia directory musicale con Groovy
- La mia libreria open source preferita per l'analisi dei file musicali
- Come utilizzo Groovy per analizzare le copertine degli album nella mia directory musicale
Ti assicureranno di comprendere la struttura prevista della mia directory musicale, la struttura creata in quell'articolo e come raccogliere file FLAC, MP3 e OGG. In questo articolo faciliterò la rimozione dei file indesiderati nelle directory degli album.
Bit di analisi del framework e dei file dell'album
Inizia con il codice. Come prima, ho incorporato commenti nello script che riflettono le "note di commento" (relativamente abbreviate) che di solito lascio per me:
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 }
Si tratta di un insieme piuttosto semplice di modifiche al framework originale.
Le righe 3-4 definiscono fileNameCount
, una mappa per registrare i conteggi dei nomi di file.
Le righe 17-27 analizzano i nomi dei file. Evito tutti i file che terminano con .flac
, .mp3
o .ogg
così come i file cover.jpg
.
Le righe 23-26 registrano i nomi dei file (come chiavi per fileNameCounts
) e i conteggi (come valori). Se il file è in realtà una directory, aggiungo un /
per aiutarlo a gestirlo nel processo di rimozione. Si noti alla riga 26 che le mappe Groovy, come le mappe Java, devono essere controllate per la presenza della chiave prima di incrementare il valore, a differenza ad esempio del linguaggio di programmazione awk.
Questo è tutto!
Lo eseguo come segue:
$ groovy TagAnalyzer4.groovy > tagAnalysis4.csv
Quindi carico il CSV risultante in un foglio di calcolo di LibreOffice accedendo al menu Foglio e selezionando Inserisci foglio da file. Ho impostato il carattere delimitatore su &$124;
.
(Chris Hermansen, CC BY-SA 4.0)
L'ho ordinato in ordine decrescente nella colonna count per enfatizzare i recidivi. Notate inoltre alle righe 17-20 un mucchio di file M3U che fanno riferimento al nome dell'album, probabilmente creati da qualche programma di ripping ben intenzionato. Vedo anche, più in basso (non mostrato), file come fix
e fixtags.sh
, prova di sforzi precedenti per risolvere qualche problema e lasciare altri residui in giro. processi. Utilizzo l'utilità della riga di comando find
per eliminare alcuni di questi file, sulla falsariga di:
$ find . \( -name \*.m3u -o -name tags.txt -o -name foo -o -name .DS_Store \
-o -name fix -o -name fixtags.sh \) -exec rm {} \;
Suppongo che avrei potuto usare anche un altro script Groovy per farlo. Magari la prossima volta.