mv * subfolder
Natürlich wird das Verzeichnis "Unterordner" nicht in sich selbst verschoben, aber alles andere wird verschoben
Ich möchte alle Dateien und Ordner aus einem Verzeichnis in einen ihrer Unterordner verschieben. Wie mache ich das?
Ich benutze BusyBox und Linux.
Ex:
Verschieben Sie alle Dateien und Ordner /my/path/
nach/my/path/subfolder/.
Kopieren und dann löschen Lösungen sind nicht erschwinglich.
Vielen Dank.
mv * subfolder
Natürlich wird das Verzeichnis "Unterordner" nicht in sich selbst verschoben, aber alles andere wird verschoben
Lösungen, die *
(durch Shell erweitert) verwendet werden, funktionieren nicht mit zu vielen Objekten in /my/path/
. In diesem Fall erhalten Sie:
argument list too long
Dieser Ansatz verwendet nicht *
:
cd /my/path/ && find . -mindepth 1 -maxdepth 1 ! -name subfolder -exec mv -t subfolder/ {} +
Leider -mindepth
und -maxdepth
Optionen von find
sind nicht POSIX-konform; Ich glaube, keine -t
der beiden Möglichkeiten mv
.
Diese Variante sollte POSIX erfüllen:
cd /my/path/ && find . ! -name . -prune ! -name subfolder -exec mv {} subfolder/ \;
(Ich habe diese Antwort von Unix und Linux SE angepasst ). Leider ruft es mv
für jedes gefundene Objekt auf, daher ist es langsam.
Schneller alternativer Ansatz, wenn Sie nur Verzeichnisse neu erstellen können (anfangs weder vorhanden /my/path/subfolder/
noch vorhanden sein /my/subfolder/
sollten):
path/
zu subfolder/
,path/
,subfolder/
in path/
.Hinweis zum inode-basierten Dateisystem sollte dies gleich schnell sein, egal wie viele Objekte vorhanden sind path/
. Der Code:
cd /my/ && test ! -e subfolder/ && mv path/ subfolder/ && mkdir path/ && mv subfolder/ path/
In diesem Fall habe ich &&
viel darauf hingewiesen, dass das Verfahren abgebrochen werden sollte, wenn einer seiner Schritte fehlschlägt. Dieser Ansatz ist jedoch unpraktisch, wenn Sie nicht standardmäßige Berechtigungen, Besitzrechte usw. benötigen path/
oder subfolder/
haben.
Vielleicht möchten Sie den mv
Befehl auschecken. Sie können versuchen, nach allen Dateien und Ordnern in einem Verzeichnis zu suchen, ein Unterverzeichnis auszuschließen und dann alle gefundenen Dateien find
mit dem mv
Befehl in dieses Unterverzeichnis zu kopieren .
Eine ähnliche Stapelüberlauf-Frage finden Sie unter https://stackoverflow.com/questions/4612157/how-to-use-mv-command-to-move-files-except-those-in-a-specific-directory
Nach mehr Graben und Experimentieren. Ich habe die Antwort gefunden: -prune
wird verwendet, um die Wiederverwendung in Unterverzeichnissen zu vermeiden. ! -name
wird verwendet, um das Ziel-Unterverzeichnis auszuschließen, und exec
führt dann den Verschiebevorgang aus. Das {}
wird durch Datei- / Verzeichnisnamen aus dem find
Befehl ersetzt.
find /my/path/* -prune ! -name subfolder -exec mv {} /my/path/subfolder/. +
Der einfachste Weg dies zu tun ist:
mv !(subfolder) subfolder
'!' bedeutet NICHT, ähnlich wie Programmiersprachen, wobei mv alle Dateien und Ordner mit Ausnahme des Unterordners in den erforderlichen Unterordner verschiebt.
Weitere Dinge wie das Verschieben von versteckten Ordnern und Punktordnern werden hier beschrieben: https://askubuntu.com/questions/91740/how-to-move-all-files-in-current-folder-to-subfolder