Alle Dateien aus Unterordnern kopieren
Manche von euch kennen vermutlich das Problem. Man hat eine sehr tiefe Verzeichnisstruktur mit zahlreichen verschachtelten Unterordnern und endlos vielen Dateien. Man möchte diese Struktur entfernen und alle Dateien einfach in einen einzigen Ordner kopieren. Die Frage ist nur: wie? Manuell kann das sehr lange dauern. Deshalb ist hier ein Skript die rettende Idee!
Mac OSX Script
Auf OSX kann man von einem Basisordner sehr einfach die komplette Verschachtelung von Unterordnern mit diesem kurzen Skript entfernen:
find . -type f -print0 | xargs -0 -I%%% cp %%% ../Import
Man bedient sich hier der Suchfunktion und leitet dessen Ausgabe einfach an ein Kopierprogramm weiter. Mit diesem Aufruf werden alle Dateien aus dem aktuellen Verzeichnis kopiert und in das übergeordnete Verzeichnis Import kopiert. Dabei wird die Hierarchie aus Unterordnern ignoriert. Alle Dateien aus Unterordnern kopieren, mehr passiert nicht. Die originale Verzeichnisstruktur bleibt bestehen.
Linux
Auch unter Linux kann man eine Verzeichnisstruktur sehr einfach abflachen (auch flatten genannt). Dazu kann man beispielsweise folgendes Kommando verenden:
find /dir1 -mindepth 2 -type f -exec mv -t /dir1 -i '{}' +
In diesem Fall verwenden wir auch die Suchfunktion. Dieses Kommando kopiert nicht die Dateien sondern verschiebt diese mit dem mv Kommando. Außerdem verschieben wir hier nicht alle Dateien, sondern ausschließlich *.avi Dateien. Diese werden in den Ordner filme verschoben.
Eine Alternative dazu wäre, die Dateien tatsächlich zu kopieren. Das ist oft sinnvoll, wenn die Verzeichnisstruktur bestehen bleiben soll. Unter Linux erreicht man das mit dem folgenden Befehl:
cd VERZEICHNISBAUM_ROOT find . -type f -print0 | xargs -0 -I%%% cp %%% ORDNER_MIT_ALLEN_DATEIEN
Was passiert hier? Mit dem find Befehl suchen wir im aktuellen Verzeichnis VERZEICHNISBAUM_ROOT nach allen Dateien. Diese schreiben wir in die Standardausgabe. Über die Pipe leiten wir diese Ausgabe an xargs weiter. Mit cp wird nun jede Datei einzeln in das Verzeichnis ORDNER_MIT_ALLEN_DATEIEN kopiert. Dort gibt es keine Unterordner mehr. Das heißt alle Dateien liegen in diesem Verzeichnis vor.
Windows
Auch unter Windows ist so etwas möglich. Dafür kann man die Kommandozeile verwenden. Folgendes Kommando ist da hilfreich:
for /r C:\Folder0 %f in (*) do @copy "%f" C:\DestFolder
Wobei man hier das Startverzeichnis und das Zielverzeichnis angeben muss. Es werden alle Dateien kopiert. Möchte man diese verschieben, dann hilft folgendes geänderte Kommando:
for /r C:\Folder0 %f in (*) do @move "%f" C:\DestFolder
Problemdetails
Wie kommt es eigentlich zu verschachtelten Ordnerstrukturen? Warum sind solche Kommandos überhaupt nötig? Das Problem ist das Dateisystem. In einem Ordner können nur begrenzt viele Dateien liegen. In heutigen Dateisystemen ist diese Zahl schon sehr groß, jedoch ist es nicht ratsam sehr viele Dateien in einen einzigen Ordner zu verwalten. Je mehr Dateien ein Ordner enthält, desto langsamer wird der Zugriff darauf. Leute die eine große Bildersammlung oder MP3 Sammlung haben kennen das vermutlich. Es dauert ewig bis die Vorschaubilder laden…
Aus diesem Grund ist eine tiefere Ordnerstruktur ratsam. Insbesondere bei Webservern hat es sich etabliert die Dateien in Unterordner nach Dateiname zu sortieren. So gibt es Beispielsweise 26 Unterordner mit den Namen a, b, c, d, … usw. und im Ordner a sind dann alle Dateien die vom Dateinamen mit einem A beginnen. Reicht das nicht aus, so kann man wieder nach dem 2. Buchstaben unterteilen usw. Will man diese Einteilung jedoch wieder zurücknehmen, dann hilft uns das oben vorgestellte Kommando.
Ich habe eine MP3-Sammlung meiner gerippten CDs in einer kompliziert verschachtelten Ordnerstruktur. Diesen File-Tree möchte ich verflachen und die MP3s statt dessen über Tags organisieren. Viele der gerippten MP3-Files in Ordnern tragen jedoch Namen wie „track01.mp3“.
Wie kann ich verhindern, dass so ein sich bereits im Destination Folder befindender File namens „track01.mp3“ nicht durch einen neu hinzukommenden überschrieben, sondern der neu hinzukommende vorher umbenannt wird.
Erstmal Easytag darüber laufen lassen:
http://wiki.ubuntuusers.de/EasyTAG
Beim Nachschauen habe ich Puddletag gefunden. Sieht vielversprechend aus; da EasyTag eine umständliche Bedienung besitzt, könntest du dieses Prog mal ausprobieren.
http://puddletag.sourceforge.net/#
Danke! Hat geklappt 🙂
Sehr gut! Hat funktioniert
find . -type f -name „*.mp3“ -exec mv {} mp3 \; führte dazu, dass alle mp3- Dateien in den Unterordnern sowie im aktuellen Verzeichnis gelöscht wurden. Stattdessen blieb eine Datei namens mp3 (mit nur einem beliebigen Lied) übrig. Was lief falsch?
in Ordner via „cd“ wechseln, dann folgenden Befehl ausführen:
„find -name ‚*‘ -exec cp {} /Zielordner ;“
Ich muss WR völlig recht geben. Eure Linux-Befehl ist totaler Quatsch. Zum Glück habe ich es bei einem alten Ordner zu erst probiert. Aber so wird wirklich der gesamte Inhalt gelöscht! Korrigiert das bitte, oder löscht das. Das ist echt keine Hilfe!
Danke für die Info, das Linux Kommando wurde korrigiert.