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.
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:
Sie möchten dies rekursiv tun (in Unterordnern und Unterordnern dieser Unterordner)
Sie möchten das Verschieben der Skriptdatei überspringen
Sie haben die Berechtigung, die Dateien in diesem Ordner zu verschieben
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.
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.
mv */* .
?mv */* .
Verschiebt keine Dateien aus dem Unterordner des Unterordners.Antworten:
Gehen Sie in Ihr
A
Verzeichnis und führen Sie es ausDies 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.
quelle
find
Sie etwas eleganter sein und nichtmv
für jede Datei einen eigenen Prozess erzeugen :find A -mindepth 2 -type f -exec mv -t A \{\} +
find . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \;
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: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
.quelle