
Gibt es eine Möglichkeit, mit cp
der --update
Option Dateien zu drucken, die nicht kopiert werden konnten, weil das Quellverzeichnis eine neuere Version der Datei enthielt?
Antwort1
Ersetzen cp -ur
mit 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, --progress
kann die Flagge sehr nützlich sein.
Antwort2
Ich glaube nicht, dass es eine Möglichkeit gibt, cp
das 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 awk
Befehl Ihren Anforderungen entsprechend ändern.
2) Sie müssen sich in dem Verzeichnis befinden, in dem file
vorhanden ist. Wenn Sie sich nicht in diesem Verzeichnis befinden, müssen Sie den find
Befehl so ändern, dass er find dirWhereFileExists
anstelle 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 find
stattdessen. 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.