Shell-Skript zum Verschieben aller Dateien aus Unterordnern in den übergeordneten Ordner

47

Ich habe ein paar Ordner im Ordner A. Ich möchte Dateien aus all diesen Ordnern in verschieben A.

Oder

Ich möchte alle Dateien aus untergeordneten Ordnern ausschneiden und in den übergeordneten Ordner einfügen.

Wie geht das?

Rahul Virpara
quelle
1
Ich habe nicht wirklich getestet diese narrensicher oder irgendetwas zu sein, aber haben Sie versucht , einfach den folgenden Befehl eingeben aus Ordnern A in einem Terminal: mv */* .?
Marty Fried
Sind Sie sicher, dass es keine doppelten Dateinamen gibt?
jippie
mv */* .Verschiebt keine Dateien aus dem Unterordner des Unterordners.
Rahul Virpara
@jippie yep, es gibt keine doppelten Namen
Rahul Virpara

Antworten:

81

Gehen Sie in Ihr AVerzeichnis und führen Sie es aus

find . -mindepth 2 -type f -print -exec mv {} . \;

Dies bedeutet "Finde alle Dateien in diesem Verzeichnis und seinen Unterverzeichnissen und führe mv mit dem Zielverzeichnis aus. Für jede gefundene Datei werden sie in das aktuelle Verzeichnis verschoben.

Tuminoid
quelle
1
Es wird auch versucht, Dateien zu verschieben, die sich bereits im übergeordneten Verzeichnis befinden.
Rahul Virpara
virpara: jetzt vergisst deine edition alle dateien in .dot verzeichnissen. Überarbeitet mit -mindepth 2, um Warnungen zu unterdrücken.
Tuminoid
1
Mit GNU können findSie etwas eleganter sein und nicht mvfür jede Datei einen eigenen Prozess erzeugen :find A -mindepth 2 -type f -exec mv -t A \{\} +
David Foerster
David, Ihre Version funktioniert so lange, bis Sie die maximale Befehlszeilenlänge erreicht haben. Dies ist nicht allzu schwierig, wenn Sie feststellen, wie die Pfade gedruckt werden, insbesondere, wenn Sie sie aus einem anderen Verzeichnis als A aufrufen, wie in Ihrem Beispiel.
Tuminoid
9
Das ist sehr gefährlich. Wenn Sie Dateien mit demselben Dateinamen in verschiedenen Unterordnern haben, werden diese beim letzten Fund überschrieben. Besser, mv mit --backup = numbered zu verwenden:find . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \;
pLumo
4

Nun, Sie könnten eine Datei erstellen und sie "cutme" nennen (um eine Datei mit dem Namen cutme im Terminaltyp zu erstellen nano cutme. Um sie zu speichern, drücken Sie STRG + X und dann die EINGABETASTE.) Und Folgendes einfügen, vorausgesetzt, dass:

  1. Sie möchten dies rekursiv tun (in Unterordnern und Unterordnern dieser Unterordner)
  2. Sie möchten das Verschieben der Skriptdatei überspringen
  3. Sie haben die Berechtigung, die Dateien in diesem Ordner zu verschieben
  4. Dateien können Leerzeichen in ihren Namen enthalten oder nicht

find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;

Beachten Sie den Namen cutme in der Zeile. Es sollte dasselbe sein wie das Skript, das Sie ausführen werden.

Führen Sie nach dem Erstellen der Datei und dem Einfügen der obigen Zeile im selben Ordner wie das Skript Folgendes aus:

chmod +x cutme. Dies wird Ihre neue Datei die „Executable“ Flagge geben , so dass Sie es wie folgt ausführen: ./cutme.

Luis Alvarado
quelle
Warum sollte ich versuchen, Dateien zu verschieben, die sich bereits im übergeordneten Verzeichnis befinden?
Rahul Virpara
Sie würden das Skript aus dem Ordner ausführen. Jede Datei darin, ob in einem Unterordner oder nicht, würde in den übergeordneten Ordner des Ordners verschoben. Der übergeordnete Ordner ist hier der übergeordnete Ordner in Bezug auf die Position des Skripts. Tatsächlich können Sie durch Ändern der letzten 2 Punkte feststellen, wohin alle Dateien in einem Ordner verschoben werden sollen, in dem Sie das Skript ausführen.
Luis Alvarado