Ich versuche, ein Bash-Skript zu schreiben, das ein vorhandenes Verzeichnis überschreibt. Ich habe ein Verzeichnis foo/
und versuche damit zu überschreiben bar/
. Aber wenn ich das mache:
cp -Rf foo/ bar/
Ein neues bar/foo/
Verzeichnis wird erstellt. Das will ich nicht Es gibt zwei Dateien in foo/
; a
und b
. Es gibt auch Dateien mit demselben Namen bar/
. Ich möchte das foo/a
und foo/b
ersetzen bar/a
und bar/b
.
bar/
übrig , die sich in einem vorhandenen Ziel ( ), aber nicht in der Quelle (foo/
) befinden Dies ist also nicht das, was die meisten Leute als vollständiges Überschreiben des Verzeichnisses betrachten würden. dh. Wennbar/baz
es bereits existiert, würde es danach noch existieren ...rm -rf bar/* && cp -TRv foo/ bar/
Mach es in zwei Schritten.
quelle
bar
Inhalt identisch ist mitfoo
und nicht eine Kombination aus Elementen ausfoo
und anderen Elementen, in denen möglicherweise bereits vorhanden warbar
. Die hoch gelobte Antwort von @Saurabh Meshram unten hat dieses Problem.rm -rf bar/; cp -r foo/ !$
foo
undbar
große Verzeichnisse sind ... vielleicht gibt es Dateien inbar
, die nicht in ,foo
dass Sie nicht wollen , zu entfernen. Dies sollte nicht als realistische Antwort imho angesehen werdenWenn Sie sicherstellen möchten, dass die
bar/
Ergebnisse identisch sind mitfoo/
, verwenden Siersync
stattdessen:Wenn sich nur wenige Dinge geändert haben, wird dies viel schneller ausgeführt als das Entfernen und erneute Kopieren des gesamten Verzeichnisses.
-a
ist ‚Archiv - Modus‘, die Kopien getreulich in Dateienfoo/
zubar/
--delete
entfernt zusätzliche Dateien nicht infoo/
ausbar/
als auch, um sicherzustellen ,bar/
endet identisch-vh
für ausführlich und lesbar hinzufoo
ist erforderlich, andernfallsrsync
wird kopiertfoo/
,bar/foo/
anstatt sichbar/
selbst zu überschreiben .foo/
auf den Inhalt von zu überschreibenbar/
, wir verwenden , um einen Schrägstrich auf beiden es ist verwirrend , weil es wird nicht funktionieren , wie mit einem Hieb auf erwartet. weder , obwohl, rsync sneakily immer den Zielpfad interpretiert , als ob es einen Schrägstrich hat, auch wenn es eine Abwesenheit von einem Slash auf der Quelle ehrt Pfad. Wir benötigen also einen Schrägstrich im Quellpfad, damit er mit dem automatisch hinzugefügten Schrägstrich im Zielpfad übereinstimmt, wenn wir den Inhalt vonfoo/
inbar/
und nicht in das Verzeichnis kopieren möchtenfoo/
selbst landet inbar/
alsbar/foo
.)rsync
ist sehr leistungsfähig und nützlich, wenn Sie neugierig sind und sich umschauen, was es sonst noch tun kann (z. B. Kopieren über ssh).quelle
cp -T
Option, weil es auch auf Macosx funktioniert tongVerwenden Sie diesen
cp
Befehl:quelle
cp
Befehl die Datei aus der Quelle entfernen?Der folgende Befehl stellt sicher, dass Punktedateien (versteckte Dateien) in der Kopie enthalten sind:
quelle
.
bedeutet alle Dateien im Verzeichnis. Natürlich wären die versteckten Dateien enthalten.Sehr ähnlich zu @Jonathan Wheeler:
Wenn Sie sich nicht erinnern, aber nicht umschreiben möchten
bar
:!$
Zeigt das letzte Argument Ihres vorherigen Befehls an.quelle
Dies sollte Ihr Problem lösen.
quelle
Die von Ihnen definierte Operation ist eine "Zusammenführung", mit der Sie dies nicht tun können
cp
. Wenn Sie jedoch nicht nach Zusammenführen suchen und den Ordner verlieren möchtenbar
, können Sie den Ordner einfachrm -rf bar
löschen und dannmv foo bar
umbenennen. Dies dauert nicht lange, da beide Vorgänge von Dateizeigern und nicht von Dateiinhalten ausgeführt werden.quelle
Versuchen Sie, diesen Befehl zu verwenden, der aus zwei Schritten besteht:
quelle