Ordner zusammenführen und Dateien mithilfe der CLI ersetzen

9

Ich möchte eine Forum-Software aktualisieren und möchte den Upgrade-Prozess mit CLI als Lernmöglichkeit testen.

Wie füge ich den Inhalt eines Ordners in einen anderen Ordner ein und ersetze Dateien?

user46165
quelle

Antworten:

10

Sie können dies verwenden rsync, um dies zu tun:

$ rsync -abviuzP src/ dest/
  • -aArchivierungsmodus; gleich -rlptgoD (kein -H, -A, -X)
  • -i Aktiviert das Einzelformat, das mehr Informationen als das Standardformat anzeigt
  • -bErstellt rsync-Sicherungsdateien, die in beiden Ordnern vorhanden sind, und hängt ~ an die alte Datei an. Sie können dieses Suffix mit --suffix .suf steuern
  • -u Durch rsync-Übertragung werden Dateien übersprungen, die in dest neuer sind als in src
  • -z Aktiviert die Komprimierung, was nützlich ist, wenn leicht komprimierbare Dateien über langsame Links übertragen werden
  • -P schaltet --partial und --progress ein
    • --partial bewirkt, dass rsync teilweise übertragene Dateien behält, wenn die Übertragung unterbrochen wird
    • --progress Zeigt für jede Übertragung einen Fortschrittsbalken an, der nützlich ist, wenn Sie große Dateien übertragen

Ich würde mehrere dieser Schalter fallen lassen, aber dies ist nur, um Ihnen den Einstieg zu erleichtern. Ich würde wahrscheinlich so etwas verwenden:

$ rsync -abuP src/ dest/

Sobald es in Ordnung aussieht, können Sie diesen Befehl ausführen, um die Sicherungsdateien zu entfernen:

$ find dest/ -name "*.~" -delete

Beispiel

Stellen wir uns vor, wir hätten die folgenden Beispieldaten.

Originale Daten

Wir werden die folgenden Befehle verwenden, um einige gefälschte Daten herzustellen.

$ seq 10 | xargs -I{} -- mkdir dest/dir{}
$ for i in $(seq 5); do echo "$i" > dest/dir$i/file$i;done

Gefälschte Daten sehen wie folgt aus:

$ tree -DsifvF --noreport dest/
dest
[       4096 Aug 29 22:21]  dest/dir1/
[          2 Aug 29 22:21]  dest/dir1/file1
[       4096 Aug 29 22:21]  dest/dir2/
[          2 Aug 29 22:21]  dest/dir2/file2
[       4096 Aug 29 22:21]  dest/dir3/
[          2 Aug 29 22:21]  dest/dir3/file3
[       4096 Aug 29 22:21]  dest/dir4/
[          2 Aug 29 22:21]  dest/dir4/file4
[       4096 Aug 29 22:21]  dest/dir5/
[          2 Aug 29 22:21]  dest/dir5/file5

neue Daten

Jetzt replizieren wir die Originaldaten ( dest/*-> src/) und fügen dem Mix einige neuere Dateien hinzu. Dies simuliert eine "neue Version".

$ cp -pr dest/* src/
$ mkdir src/dir11
$ for i in 1 3 5 11; do echo "$i$i" > src/dir$i/file$i;done

Gefälschte Daten sehen wie folgt aus:

$ tree -DsifvF --noreport src/
src
[       4096 Aug 29 22:21]  src/dir1/
[          3 Aug 29 23:00]  src/dir1/file1
[       4096 Aug 29 22:21]  src/dir2/
[          2 Aug 29 22:21]  src/dir2/file2
[       4096 Aug 29 22:21]  src/dir3/
[          3 Aug 29 23:00]  src/dir3/file3
[       4096 Aug 29 22:21]  src/dir4/
[          2 Aug 29 22:21]  src/dir4/file4
[       4096 Aug 29 22:21]  src/dir5/
[          3 Aug 29 23:00]  src/dir5/file5
[       4096 Aug 29 23:00]  src/dir11/
[          5 Aug 29 23:00]  src/dir11/file11

füge src / in dest / zusammen

Dies ahmt nach, dass wir gerade unseren neuen Softwarebaum eingerichtet haben src/und in unser bereits vorhandenes Verzeichnis einbinden möchten dest/.

$ rsync -abuP src/ dest/
sending incremental file list
dir1/file1
           3 100%    0.00kB/s    0:00:00 (xfer#1, to-check=5/13)
dir11/
dir11/file11
           5 100%    4.88kB/s    0:00:00 (xfer#2, to-check=4/13)
dir3/file3
           3 100%    2.93kB/s    0:00:00 (xfer#3, to-check=2/13)
dir5/file5
           3 100%    2.93kB/s    0:00:00 (xfer#4, to-check=0/13)

sent 416 bytes  received 97 bytes  1026.00 bytes/sec
total size is 18  speedup is 0.04

Wie Sie sehen können, wurden die folgenden Dateien aktualisiert: Datei1, Datei3, Datei5 und die neu hinzugefügte Datei dir11 + file11.

Und als Bestätigung können wir sehen, dass die folgenden Sicherungsdateien erstellt wurden, rsyncals sie auf die bereits vorhandenen Dateien in stießen dest/.

$ find dest/ | grep "~"
dest/dir3/file3~
dest/dir1/file1~
dest/dir5/file5~
slm
quelle
Um den obigen Punkt zu verdeutlichen: Sobald es OK aussieht, können Sie diesen Befehl ausführen, um die Sicherungsdateien zu entfernen:> $ find dest / -name "start dot ~" -delete Dies schien für mich nicht zu funktionieren, während:> $ find dest / -name "start dot star ~" -delete hat es getan. Ich bin mir nicht sicher, ob das ein Tippfehler ist oder etwas, das nicht richtig eingestellt ist!
2

Sie können cp -r name_of_the_folder / * name_of_the_destination_folder verwenden, wobei das Sternchen (*) für alle Dateien und -r für rekursive Kopien steht.

Sie können auch die Option -i verwenden, mit der Sie gefragt werden, ob Sie den Inhalt überschreiben möchten.

Spyros Chiotakis
quelle