it-swarm.com.de

Wie kopiere ich zwei Verzeichnisse?

Ich habe zwei Verzeichnisse images und images2 mit dieser Struktur unter Linux:

/images/ad  
/images/fe  
/images/foo  

... und andere 4000 Ordner

und der andere ist wie:

/images2/ad  
/images2/fe  
/images2/foo

... und andere 4000 Ordner

Jeder dieser Ordner enthält Bilder und die Namen der Verzeichnisse unter images und images2 sind genau gleich, ihr Inhalt ist jedoch unterschiedlich. Dann möchte ich wissen, wie ich die Bilder von/images2/ad in images/ad, die Bilder von/images2/foo in images/foo usw. mit allen 4000 Ordnern kopieren und zusammenführen kann.

126
ssierral

Dies ist ein Job für rsync . Es hat keinen Vorteil, dies manuell mit einer Shell-Schleife zu tun, es sei denn, Sie möchten die Datei verschieben, anstatt sie zu kopieren.

rsync -a /path/to/source/ /path/to/destination

In Ihrem Fall:

rsync -a /images2/ /images/

(Beachten Sie den abschließenden Schrägstrich auf images2, Andernfalls würde er nach /images/images2 Kopiert.)

Wenn in beiden Verzeichnissen Bilder mit demselben Namen vorhanden sind, überschreibt der obige Befehl /images/SOMEPATH/SOMEFILE Mit /images2/SOMEPATH/SOMEFILE. Wenn Sie nur ältere Dateien ersetzen möchten, fügen Sie die Option -u Hinzu. Wenn Sie die Version immer in /images Behalten möchten, fügen Sie die Option --ignore-existing Hinzu.

Wenn Sie die Dateien mit rsync aus /images2 Verschieben möchten, können Sie die Option --remove-source-files Übergeben. Dann kopiert rsync nacheinander alle Dateien und entfernt jede Datei, wenn sie fertig ist. Dies ist viel langsamer als das Verschieben, wenn sich das Quell- und das Zielverzeichnis im selben Dateisystem befinden.

Die beste Wahl ist, wie bereits veröffentlicht, natürlich rsync. Trotzdem wäre auch unisono eine großartige Software, um diesen Job zu erledigen. Beide können in mehreren Betriebssystemen verwendet werden.

Rsync

rsync synchronisiert in einer Richtung von der Quelle zum Ziel. Daher die folgende Aussage

rsync -avh --progress Source Destination

synchronisiert alles von Quelle bis Ziel . Der zusammengeführte Ordner befindet sich im Ziel .

- a bedeutet "Archiv" und kopiert alles rekursiv von der Quelle zum Ziel, wobei fast alles erhalten bleibt.

- v liefert mehr Ausgabe ("ausführlich").

- h für Menschen lesbar.

- Fortschritt , um zu zeigen, wie viel Arbeit erledigt ist.

Wenn Sie nur möchten, aktualisieren Sie den Zielordner mit neueren Dateien aus dem Quellordner:

rsync -avhu --progress source destination

Einklang

unison synchronisiert in beide Richtungen. Daher die folgende Aussage

unison Source Destination

synchronisiert beide Verzeichnisse in beide Richtungen und schließlich entspricht Quelle dem Ziel. Es ist, als würde man rsync zweimal von der Quelle zum Ziel und umgekehrt ausführen.

Weitere Informationen zur Verwendung finden Sie auf den Manpages oder auf den folgenden Websites:

  1. https://www.cis.upenn.edu/~bcpierce/unison/
  2. https://rsync.samba.org/
46
debiarch
for dir in images2/*; do mv "$dir"/* "images/$(basename "$dir")"; done

Durchlaufen Sie den gesamten Inhalt von images2 Mit einem erweiterten Glob (um Probleme beim Parsen von ls zu vermeiden) und mv den Inhalt dieser Elemente mit dem entsprechenden Eintrag in images. Verwendet basename, um das führende images2 Vom Globbed-Pfad zu entfernen.

5
Etan Reisner

@ inulinux12 können Sie die folgende einzeilige for Schleife von der Befehlszeile aus verwenden:

$ for dir in images2/*; do mv "$dir"/* "${dir/2/}"; done

Dadurch werden alle Dateien von images2 bis images in ihren jeweiligen Verzeichnissen. Hinweis: Dies setzt voraus, dass keine Dateien denselben Namen haben.

Zum Beispiel:

Vor der Ausführung:

$ ls -R images*
images:
ad  adfoo  fe
images/ad:
jpg.1  jpg.2
images/adfoo:
jpg.7
images/fe:
jpg.5
images2:
ad  adfoo  fe
images2/ad:
jpg.3
images2/adfoo:
jpg.6
images2/fe:
jpg.4

Nach der Ausführung:

$ ls -R images*
images:
ad  adfoo  fe
images/ad:
jpg.1  jpg.2  jpg.3
images/adfoo:
jpg.6  jpg.7
images/fe:
jpg.4  jpg.5
1
Simply_Me