Nur Ordner finden

2

Meine Festplatte ist in einem Durcheinander, also habe ich beschlossen, eine Bereinigung durchzuführen. Als Teil davon möchte ich alle Ordner, die Musik enthalten, in einem zusammenführen. Was ich tun möchte, ist, auf meinem Laufwerk nach * .mp3 und * .aac zu suchen und den Namen der Ordner abzurufen. Dann möchte ich alle doppelten Ordnernamen entfernen und in einem letzten Schritt nur die Stammverzeichnisse greifen. Es fällt mir schwer, das genau zu erklären. Hier ist ein Bild eines Beispielbaums:

root1 
|--folder1
  |--sub1
    |--file1.mp3
    |--file2.aac
  |--sub2
  |--sub3
    |--file3.mp3
    |--file4.aac
|--folder2
  | ...contains photos and documents (no mp3/aac)...
root2
|--folder3
  |--file4.mp3
  |--file5.aac
|--folder4
  |--file6.mp3

Für dieses Beispiel ist meine gewünschte Ausgabe root1/folder1 root2/folder3 root2/folder4.

Da ich nur begrenzte Kenntnisse über Bash- und UNIX-Tools habe, habe ich keine Ahnung, wie das geht. Gibt es einen Weg, dies zu erreichen? Ich bin in Ordnung, wenn Ihre Lösung Funktionen find, aber es wäre viel besser, wenn locatestattdessen verwendet wird.

Max Beikirch
quelle
Gibt es einen Grund, warum Sie nicht einfach mit einem GUI-Suchwerkzeug nach Dateien suchen können, die auf .mp3 enden, und dann nach dem Ordner sortieren können, in dem sich die Datei befindet? Verschieben Sie die Dateien dann einfach dorthin, wo Sie möchten.
David
Wenn Sie locate verwenden, vergewissern Sie sich bitte, dass Ihr Standort auf dem neuesten Stand ist. Anderenfalls fehlen einige der Dateien, die Sie nach der Aktualisierung hinzugefügt haben. (Fügen Sie beispielsweise MP3s hinzu. Updatedb. (Notieren Sie den Speicherort aller MP3s.) Fügen Sie weitere MP3s hinzu (die noch nicht in der Lokalisierungsdatenbank enthalten sind!)
Hennes
@Jikag: Das würde die Struktur der Unterordner zerstören, ich möchte es behalten.
Max Beikirch

Antworten:

3

Gehen Sie in jeden der letzten Ordner der obersten Ebene und verschieben Sie alle .mp3- oder .aac-Dateien unter diesem Ordner in den aktuellen Ordner. Entfernen Sie dann die jetzt leeren Ordner. Versuchen Sie Folgendes:

for f in root*/folder*; do
    cd $f
    find -name "*mp3" -exec sh -c "mv {}  \$(basename {})" \;
    find -name "*aac" -exec sh -c "mv {}  \$(basename {})" \;
    find -type d -exec rmdir {} \;
    cd -
done

Es werden Fehler beim Versuch angezeigt, nicht leere Ordner in rmdir zu speichern. Die leeren Ordner werden jedoch entfernt.

Wenn Sie nur wissen möchten, welche Ordner der obersten Ebene Unterordner mit MP3- oder AAC-Dateien enthalten:

find -name "*mp3" -o -name "*aac" | cut -d/ -f1-3 | sort -u

Suchen Sie alle .mp3- oder .aac-Dateien, die eine Reihe von Zeilen wie "./root2/folder3/file4.mp3" zurückgeben. Entfernen Sie dann mit cut alles außer den ersten drei Teilen des Pfads "./root2/folder3". Verwenden Sie abschließend sort -u, um alle Duplikate zu verwerfen.

Neil
quelle
Meine Güte, ich habe deine Antwort nicht bis zum Ende gelesen. Danke!
Max Beikirch
2

Suchen Sie alle Dateien, die auf mp3 oder aac enden, entfernen Sie den Dateinamen mit sed und drucken Sie nur ein Mal in jedem Ordner.

locate  --regex '.*(aac|mp3)$' | sed -e 's,/[^/]*$,,' | uniq
Ярослав Рахматуллин
quelle