Aufrufen von cp aus BASH und Verwenden der Option -u

Aufrufen von cp aus BASH und Verwenden der Option -u

Gibt es eine Möglichkeit, mit cpder --updateOption Dateien zu drucken, die nicht kopiert werden konnten, weil das Quellverzeichnis eine neuere Version der Datei enthielt?

Antwort1

Ersetzen cp -urmit rsync -urvv.

Die beiden „v“s dort sind kein Tippfehler: Sie dienen der Ausführlichkeit, um die übersprungenen Dateien anzuzeigen.

Die übersprungenen Dateien sehen wie folgt aus the_filename is newer. Um die Liste der übersprungenen Dateien zu erhalten, können Sie diesen Einzeiler verwenden:

rsync -urvv source/ target | grep ' is newer$' | sed -e 's/ is newer$//'

Oder wenn Sie es interaktiv verwenden, --progresskann die Flagge sehr nützlich sein.

Antwort2

Ich glaube nicht, dass es eine Möglichkeit gibt, cpdas direkt zu tun, aber das hier sollte im Wesentlichen dasselbe bewirken:

cp -vu file destination | awk '{ gsub("[`\x27]", "", $1); print $1 } END { if (NR == 0) print "NOFILES" }' | xargs -I{} find . ! -name {} -maxdepth 1

Dieser kleine Einzeiler ist mit einigen Einschränkungen verbunden:

1) Es muss keine Datei mit dem Namen „NOFILES“ vorhanden sein. Sie können diese Zeichenfolge im awkBefehl Ihren Anforderungen entsprechend ändern.

2) Sie müssen sich in dem Verzeichnis befinden, in dem filevorhanden ist. Wenn Sie sich nicht in diesem Verzeichnis befinden, müssen Sie den findBefehl so ändern, dass er find dirWhereFileExistsanstelle von lautet . find . Wenn Sie nicht aus einem einzelnen Verzeichnis kopieren, können Sie find dir1 dir2...stattdessen verwenden.

3) Es funktioniert nicht, wenn Ihre Dateinamen aus irgendeinem Grund Backticks oder einfache Anführungszeichen enthalten.

Wie Sie sehen, handelt es sich hierbei nicht um die robusteste Lösung, für einen einmaligen Vorgang sollte sie jedoch ausreichen.

BEARBEITEN

Als ich heute Morgen aufwachte, wurde mir klar, dass die obige Lösung Mist war. Wenn Sie versuchten, mehrere Dateien zu kopieren, würde es so oft suchen, wie Sie Dateien haben, wobei jedes Mal eine Datei ausgeschlossen wird. Die folgende Lösung sollte jedoch funktionieren:

cp -vu file destination | awk '{ gsub("[`\x27]", "", $1); regex = $1 "|" regex } END { if (NR == 0) { regex = "NOFILES|" } print ".*/("substr(regex, 0, length(regex))")" }' | xargs -I{} find . -regextype posix-extended ! -regex {} -maxdepth 1

Es erstellt während des Vorgangs einen regulären Ausdruck und übergibt diesen findstattdessen. Es gelten die gleichen Einschränkungen wie oben.

Entschuldigen Sie den Aussetzer vorhin. Ich schätze, es war zu spät, um auf StackOverflow zu sein.

Antwort3

Würde rsync die Aufgabe für Sie erledigen? Es hat viele Optionen, die Ihrer Beschreibung entsprechen, z. B. „neuere Dateien nicht überschreiben“ und so weiter. Und Sie können Ergebnisse protokollieren lassen. Ich verwende es häufig zum Remote- UND lokalen Kopieren von Dateien.

Sie können damit auch sehr detailliert vorgehen.

Viel Glück.

verwandte Informationen