Ich habe zwei Verzeichnisse images und images2 mit dieser Struktur in Linux:
/images/ad
/images/fe
/images/foo
... und weitere 4000 Ordner
und der andere ist wie:
/images2/ad
/images2/fe
/images2/foo
... und weitere 4000 Ordner
Jeder dieser Ordner enthält Bilder, und die Namen der Verzeichnisse unter Bildern und Bildern2 sind identisch, unterscheiden sich jedoch in ihrem Inhalt. 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.
Antworten:
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.
In deinem Fall:
(Beachten Sie den abschließenden Schrägstrich
images2
, ansonsten würde er nach kopiert/images/images2
.)Wenn Bilder mit dem gleichen Namen in beiden Verzeichnissen vorhanden ist , wird der Befehl über überschrieben
/images/SOMEPATH/SOMEFILE
mit/images2/SOMEPATH/SOMEFILE
. Wenn Sie nur ältere Dateien ersetzen möchten, fügen Sie die Option hinzu-u
. Wenn Sie die Version immer beibehalten möchten/images
, fügen Sie die Option hinzu--ignore-existing
.Wenn Sie die Dateien
/images2
mit rsync verschieben möchten , können Sie die Option übergeben--remove-source-files
. Dann kopiert rsync der Reihe nach alle Dateien und entfernt jede Datei, wenn sie fertig ist. Dies ist viel langsamer als das Verschieben, wenn sich das Quell- und das Zielverzeichnis auf demselben Dateisystem befinden.quelle
rsync
, dannrm -r /images
.rsync -a images images2
, werden nur die Bilder2 in die Bilder kopiert, anstatt sie zusammenzuführen.Die beste Wahl ist natürlich rsync. Trotzdem wäre auch unisono ein tolles Stück Software, um diesen Job zu erledigen. Beide können in mehreren Betriebssystemen verwendet werden.
Rsync
rsync synchronisiert in eine Richtung von der Quelle zum Ziel. Daher die folgende Aussage
Synchronisiert alles von der Quelle zum Ziel . Der zusammengeführte Ordner befindet sich in Ziel .
-a bedeutet "Archiv" und kopiert alles rekursiv von der Quelle zum Ziel, wobei fast alles erhalten bleibt.
-v gibt mehr aus ("ausführlich").
-h Für Menschen lesbar.
- Fortschritt, um zu zeigen, wie viel Arbeit geleistet wird.
Wenn Sie nur aktualisieren die Zielordner mit neueren aus Quellordnern Dateien:
Einklang
unisono synchronisiert in beide Richtungen. Daher die folgende Aussage
Synchronisiert beide Verzeichnisse in beide Richtungen und schließlich ist Quelle gleich Ziel. Es ist, als würde man zweimal von der Quelle zum Ziel und umgekehrt rsync ausführen.
Weitere Informationen finden Sie auf den Manpages oder auf den folgenden Websites:
quelle
rsync -avh --progress source/ destination/
, da sonst der Quellordner im Zielordner erstellt wird, zumindest in meinem Fall, in dem dies der Fall war.Durchlaufen Sie den gesamten Inhalt der
images2
Verwendung eines erweiterten Glob (um Probleme beim Parsen zu vermeidenls
) und dannmv
den Inhalt dieser Elemente mit dem entsprechenden Eintrag inimages
. Wird verwendetbasename
, um die Führungslinieimages2
vom globbed-Pfad zu entfernen.quelle
@ inulinux12, Sie können die folgende einzeilige
for
Schleife von der Befehlszeile aus verwenden:Dadurch werden alle Dateien aus bewegen
images2
zuimages
in ihren jeweiligen Verzeichnissen. Hinweis: Dies setzt voraus, dass keine Dateien den gleichen Namen haben.Zum Beispiel:
Vor der Ausführung:
Nach der Ausführung:
quelle
ls
. mywiki.wooledge.org/ParsingLsbasename
in dieser bestimmten Situation (es ist nicht erforderlich, dies aufzurufenbasename
). Nochmals vielen Dank für konstruktive Kommentare.