Alle Dateien aus Unterverzeichnissen in das aktuelle Verzeichnis verschieben?

13

Wie kann ich die in allen Unterverzeichnissen enthaltenen Dateien in das aktuelle Verzeichnis verschieben und dann die leeren Unterverzeichnisse entfernen?

Ich habe diese Frage gefunden , aber die Antwort angepasst an:

mv * .

funktioniert nicht; Ich habe viele Warnungen erhalten, die wie folgt aussehen:

mv: wil and ./wil are identical

Die in den Unterverzeichnissen enthaltenen Dateien haben eindeutige Namen.

Richard
quelle

Antworten:

22

Sie können auch die -mindepthOption verwenden:

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

(Zusammen mit -maxdepthIhnen können Sie auch die Hierarchieebenen einschränken, auf denen die Dateien erfasst werden sollen.)

Ich habe mv -i("interaktiv") verwendet, um mvFragen zu stellen , bevor ich Dateien überschreibe. Bei vielen Unterverzeichnissen kann es zu Namenskonflikten kommen, vor denen Sie gewarnt werden möchten.

Die --Option stoppt die Optionsverarbeitung und wird daher mvnicht durch Dateinamen verwechselt, die mit einem Bindestrich beginnen.

Bereinigen Sie die ganze Reihe leerer Unterverzeichnisse mit

find . -depth -mindepth 1 -type d -empty -exec rmdir {} \;
Florian Jenn
quelle
Gibt es auch eine Möglichkeit, die Frage zum Überschreiben der Dateien zu überspringen, indem Sie sie nicht überschreiben?
Filnor
2
Optionen für mv :: -n, --no-clobberüberschreiben Sie keine vorhandene Datei. Das könnte Sie auch interessieren -b, --backup.
Florian Jenn
5

Versuche dies:

find ./*/* -type f -print0 | xargs -0 -J % mv % .

Weitere Informationen: Probieren Sie das Find-Stamement alleine aus. Es sollte eine Liste mit allen Dateien enthalten, die Sie verschieben möchten (lassen Sie das weg -print0). Beispiel:

probe:test trurl$ find ./*/* -type f
./test_s/test_s_s/testf4
./test_s/test_s_s/testf5
./test_s/testf1
./test_s/testf2
./test_s/testf3
./test_s2/testf6
./test_s2/testf7

mit -print0und xargsSie erstellen jetzt eine Liste der auszuführenden Anweisungen. Das -J %Flag bedeutet, das Listenelement hier einfügen, damit mv $FILE .es für jede gefundene Datei ausgeführt wird.

Das obige funktioniert für die BSD xargs. Wenn Sie die GNU-Version (Linux) verwenden, nehmen Sie -I %statt-J %

trurl
quelle
0

Bash 4:

shopt -s globstar
for file in **; do [[ -f "$file" ]] && mv "$file" .; done
an einer
quelle
-2

1 schneller Trick, funktioniert nur, wenn Ihre Dateien Erweiterungen (mit einem Punkt) haben:

mv *.* subdir/
mv .* subdir/
Guillermo
quelle
-2

Führen Sie einfach diesen Befehl aus :-)

mv **/*.* .

Paul Digi
quelle
1
Das findet keine Dateien, die keinen .Namen haben, oder?
G-Man sagt "Reinstate Monica"