Verschieben von Dateien und Ordnern in einen Unterordner

1067
hebbo

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.

0
Ein GUI-Dateimanager ist möglicherweise eine gute Option, sollte keine Überraschungen bieten Xen2050 vor 6 Jahren 0

5 Antworten auf die Frage

1
Gman Smith
mv * subfolder 

Natürlich wird das Verzeichnis "Unterordner" nicht in sich selbst verschoben, aber alles andere wird verschoben

Ist das in der Spezifikation von mv? oder hofft das, Glück zu haben? Es kann beim ersten Fehler aufhören, und am Ende werden einige Dateien und Ordner verschoben, aber nicht alle. hebbo vor 6 Jahren 0
@hebbo wird beim ersten Ausfall nicht aufhören Gman Smith vor 6 Jahren 0
* schließt verborgene Dateien aus (oder das Testen zeigt mich, obwohl es wahrscheinlich irgendwo eine Einstellung dafür gibt) Xen2050 vor 6 Jahren 0
1
Kamil Maciorowski

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 -mindepthund -maxdepthOptionen von findsind nicht POSIX-konform; Ich glaube, keine -tder 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 mvfü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):

  • umbenennen path/zu subfolder/,
  • neu erstellen path/,
  • bewegen 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.

0
CheesyMacHack

Vielleicht möchten Sie den mvBefehl auschecken. Sie können versuchen, nach allen Dateien und Ordnern in einem Verzeichnis zu suchen, ein Unterverzeichnis auszuschließen und dann alle gefundenen Dateien findmit dem mvBefehl 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

0
hebbo

Nach mehr Graben und Experimentieren. Ich habe die Antwort gefunden: -prunewird verwendet, um die Wiederverwendung in Unterverzeichnissen zu vermeiden. ! -namewird verwendet, um das Ziel-Unterverzeichnis auszuschließen, und execführt dann den Verschiebevorgang aus. Das {}wird durch Datei- / Verzeichnisnamen aus dem findBefehl ersetzt.

find /my/path/* -prune ! -name subfolder -exec mv {} /my/path/subfolder/. + 
Welche "find" Implementierung kann das? Normalerweise…… -exec mv {} / mein / Pfad / Unterordner /. + `schlägt fehl, weil Sie` {} `und` + `nicht trennen können, sie müssen ganz am Ende sein:` {} + `; Dies ist bei `\;` nicht der Fall. Kamil Maciorowski vor 6 Jahren 0
Dies kann unnötig komplex sein. Raghu Ranganathan vor 6 Jahren 0
Ich benutze busyBox hebbo vor 6 Jahren 0
0
Raghu Ranganathan

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

Dies funktionierte nicht mit der Version von find, die ich verwende. hebbo vor 6 Jahren 0