Suchen Sie nach Verzeichnissen ohne Musikdateien

7

Mein ~/Music/Verzeichnis ist tatsächlich voll mit "leeren" Verzeichnissen, die ich bereinigen möchte. Ich sage "leer", weil diese Verzeichnisse tatsächlich Dateien enthalten, einige alte Titelbilddateien enthalten oder Thumbs.db files.

Ich möchte rekursiv alle diese Verzeichnisse löschen, die keine Musikdateien oder andere Verzeichnisse enthalten.

Zum Beispiel ~ / Music / Audioslave / enthält viele Verzeichnisse mit Albumnamen und ohne Musikdateien, aber ich möchte es nicht löschen, da sich darin die Musikdateien befinden. Ich möchte jedoch ~ / Music / Audioslave / oldalbum / löschen, wenn das oldalbum-Verzeichnis weder Musikdateien noch andere Verzeichnisse enthält.

volotec
quelle
Follow-up-Fragen: (1) Haben Sie nur einen Ordner mit vielen anderen Ordnern, die andere Dateien als Musikdateien enthalten? (2) Meinten Sie, Sie haben einen Ordner mit Ordnern, die sowohl Ordner als auch Dateien enthalten, in denen einige Ordner Musikdateien enthalten und andere nicht?
slm
Siehe die von mir bereitgestellte Lösung, mit der das Problem mit verschachtelten Verzeichnissen behoben werden kann.
slm
Ihre Formulierung ist immer noch deaktiviert (zumindest für mich). Ich denke, Sie möchten damit sagen, dass Sie keine Verzeichnisse löschen möchten, die MP3-Dateien enthalten oder verschachtelte Verzeichnisse enthalten, die MP3-Dateien enthalten, nicht wahr?
slm
genau das brauche ich, aber auch für .flac und .m4a!
Volotec
Die Antwort, die ich gegeben habe, gibt Ihnen dies. Ich werde diese Medientypen auch hinzufügen.
slm

Antworten:

4

Ich habe dieses Beispiel auf SO mit dem Titel gefunden: Terminal - Alle Ordner löschen, die keine MP3-Dateien enthalten .

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

Beispiel

Beispieldaten.

.
|-- 1
|   |-- 1.mp3
|   `-- 1.txt
|-- 2
|   `-- 2.mp3
|-- 3
|   `-- 3.txt
|-- 4
|   `-- 4.txt
|-- 5
|   `-- 5.mp3
|-- 6
|   `-- 61
|       `-- 61.mp3
|-- 7
|   `-- 71
|       `-- 71.txt
`-- deletenomp3.bash

Probelauf

Wenn ich es ausführen würde, würde es Folgendes löschen:

$ ./deletenomp3.bash 
./7 no mp3
./7/71 no mp3
./4 no mp3
./3 no mp3

Andere Dateitypen

Sie können dies einfach erweitern, indem Sie -namedem zweiten Befehl find im Skript weitere Argumente hinzufügen . Beispiel zum Hinzufügen von .wavDateien:

 v=$(find "$D" -iname '*.mp3' -o -iname '*.wav');

Das sagt *.mp3ODER *.wav. So fügen Sie mehr oder andere hinzu:

 v=$(find "$D" -iname '*.mp3' -o -iname '*.flac' -o -iname '*.m4a');

Ich bin sicher, dieser Block könnte komprimiert werden, wenn Sie viel mehr Dateitypen hätten, wenn Sie alternativ zu wechseln find.

slm
quelle
OK, es hat funktioniert! Vielen dank für Deine Hilfe. Ich wollte Ihre Antwortpunkte geben, aber da ich neu bin, lässt mich das System nicht zu, da mir Reputationspunkte fehlen :(
volotec
@volotec - Sie können es als akzeptierte Antwort markieren 8-). Sobald Sie mehr als 15 Punkte erreicht haben, können Sie mit der Abstimmung beginnen.
slm
6

Eine lustige Lösung beinhaltet ein findInside a find, aber auf sicherere Weise als die akzeptierte Antwort (ich persönlich mag es nicht, die Ausgabe eines Befehls zu analysieren, zu sein lsoder find, insbesondere ohne Vorsichtsmaßnahmen). Der folgende Befehl drucken die Ordner , die keine enthalten Musik - Datei (hier Musikdateieinrichtung hat eine Erweiterung mp3, flac, ogg, wavoder m4a, aber ich fühle mich frei , um einige mehr hinzugefügt werden ):

find . -depth -type d \! -exec sh -c 'find "$1" \( -iname "*.mp3" -o -iname "*.flac" -o -iname "*.ogg" -o -iname "*.wav" -o -iname "*.m4a" \) -type f | read a' _ {} \; -print

Sie sollten dies auf Ihrem System versuchen. Wenn Sie mit dem Verhalten zufrieden sind, ersetzen Sie das Finale -printdurch-exec rm -rfv -- {} \;

Die Art und Weise, wie die Dateinamen hier verwendet werden, macht diese Methode 100% sicher in Bezug auf Dateinamen mit lustigen Symbolen (dh Leerzeichen, Anführungszeichen, Zeilenumbrüche, nachfolgende Zeilenumbrüche, führende und nachfolgende Leerzeichen usw.).

gniourf_gniourf
quelle
@volotec - wie ich in meiner Antwort angegeben habe, könnte es verdichtet werden, so geht's.
slm
0

Versuchen Sie etwas in dieser Richtung (ungetestet):

for dir in ~/Music/* ; do
    found=false
    # Add your music file extensions here.
    for file in "$dir"/*.{mp3,wav} */ ; do
        if ls "$file" > /dev/null 2>&1 ; then
            found=true
            break
        fi
    done

    if ! $found ; then
        # Remove 'echo' when you are ready.
        echo rm -vrf "$dir"
    fi
done

Ich bin mir nicht sicher, wie viele Muscheln das */Globbing unterstützen. Zumindest Bash und Zsh.


quelle
1
Die Verzeichnisse sind nicht leer. Was er wirklich will, sind Verzeichnisse, die nicht '* .mp3' oder vielleicht '* .wav' enthalten.
Jordan
Ja, ich weiß. Die Verzeichnisse, die ich entfernen möchte, enthalten bestimmte Dateien, die keine Musik sind. Zum Beispiel Thumbs.db-Dateien. Aus diesem Grund kann ich die Option -empty nicht für find
volotec
Ich habe die Frage zu schnell gelesen und den Hauptpunkt übersehen. Ich werde eine neue Antwort schreiben.
Ich habe meine Antwort ersetzt.
Durch das Ausführen Ihres Skripts wurde mir klar, dass meine Frage unvollständig war. Ich werde es bearbeiten, danke!
Volotec