Bash: MV-Verzeichnis nacheinander

7

Ich versuche, alle Unterverzeichnisse eines Ordners auf eine andere Freigabe auf demselben Server zu verschieben. Wenn ich ein MV * mache, wird mir der Speicherplatz ausgehen, da die Ordner erst entfernt werden, wenn alle Ordner übertragen wurden. Daher möchte ich ein kurzes Skript erstellen, das jedes einzelne durchläuft. Hat jemand ein Beispiel, das ich mir ansehen kann? Ich habe mich umgesehen, kann aber nicht genau das finden, wonach ich suche.

NinjaCat
quelle
2
Aus Neugier: Ich hätte gedacht, dass das Verschieben von Verzeichnissen innerhalb einer Partition "augenblicklich" ist, egal wie voll das Verzeichnis ist?
Hagen von Eitzen
Nicht, wenn Sie dies über eine Netzwerkverbindung tun. Dann werden alle Dateien heruntergeladen und erneut hochgeladen.
MSalters
Ich hatte dieses Problem beim Verschieben von Dateien auf einem Host zwischen zwei Ordnern, die sich zufällig in zwei verschiedenen ZFS-Datasets (im selben Pool) befanden und daher wie verschiedene Dateisysteme behandelt wurden. Etwas zu beachten.
Programster

Antworten:

20

Sie könnten verwenden rsync(1):

rsync --remove-source-files /path/to/source /path/to/destination

Dadurch werden erfolgreich übertragene Dateien aus dem ursprünglichen Pfad entfernt.

dawud
quelle
2
+1 Um ein geeignetes Tool für einen geeigneten Job zu verwenden, wird nicht jede Aufgabe am besten in einem schnell erstellten Bash-Skript
erledigt
10

Du willst for.

Ein Beispiel (dies zeigt nur, was getan wird):

for item in *; do
    echo mv "$item" /destination/directory
done

Wenn Sie glücklich sind, entfernen Sie, um echoes wirklich zu tun.

Michael Hampton
quelle
4

Die Verwendung des mvBefehls zum Verschieben von Dateien von einem Volume auf ein anderes Volume ist ein Kopiervorgang. Aber wie würde Ihnen der Speicherplatz auf dem Quellvolume ausgehen? Auf dem Zieldatenträger würde nur dann der Speicherplatz ausgehen, wenn dieser Datenträger kleiner als die Gesamtgröße der Dateien ist, die Sie verschieben. In beiden Fällen wird jedoch nur Speicherplatz auf dem Quellvolume freigegeben, nicht jedoch mehr Speicherplatz.

Wenn Sie mvDateien auf demselben Volume von einem Verzeichnis in ein anderes verschieben, ist dies nur ein Umbenennungsvorgang. Sie kopieren keine Daten, sondern passen lediglich die Dateizeiger an, um eine andere Verzeichnishierarchie anzuzeigen. Ihnen wird nicht der Speicherplatz ausgehen, da die Dateidaten genau dort bleiben, wo sie waren.

Ich bin mir nicht sicher, ob ich das Problem sehe. :-) Hast du das tatsächlich versucht und hast keinen Platz mehr oder versuchst du nur vorauszuplanen?

Craig
quelle
Ich denke, der Benutzer verwendet ein Netzwerkdateisystem, um zwei verschiedene Verzeichnisbäume auf derselben realen Partition zu exportieren und zwischen ihnen zu kopieren. Er sendet sie aus irgendeinem Grund über TCP von einem Netzwerkdateisystem zum anderen, obwohl sie sich auf derselben befinden Scheibe ... Seltsam, ich weiß, aber es würde dieses Problem verursachen ...
Vality
Ich habe mich darüber gewundert, und das würde zu vorübergehenden Duplikaten führen, da die Operation nicht nur Affen mit Dateizeigern sein konnte. In diesem Fall scheint es jedoch viel besser zu sein, eine Shell-Sitzung direkt auf diesem Computer durchzuführen und mvden effizienten Weg zu nutzen.
Craig
2

ls -1 | xargs -n1 -i echo mv '{}' destination

Entfernen Sie einfach das Echo, wenn Sie zufrieden sind.

Florin Asăvoaie
quelle
Und fügte hinzu: -d "\ n"
NinjaCat
1

Nur als Referenz glaube ich, dass der mvBefehl keine Kopier- und Löschoperation ausführt, dh hat

mv /home/foo /home/bar

existieren gleichzeitig für eine kurze Zeit. Es funktioniert eher wie das Umbenennen. Es ist wichtig, die Dateisystemabrechnung so zu ändern, dass das, worauf /home/foojetzt hingewiesen wird, darauf hinweist, /home/bardass die Daten auf der Festplatte nicht physisch von einem Ort an einen anderen verschoben oder kopiert und dann vom vorherigen Speicherort gelöscht werden.

kalikid021
quelle
Ich denke, er kopiert zwischen verschiedenen Dateisystemen und verschiebt nicht nur ein Verzeichnis auf einen neuen Pfad.
Vality