Wie kopiere ich eine Datei in Unix, ohne die zuletzt geänderte Zeit zu ändern?

89

Wenn ich eine Datei mit von einem Ort zu einem anderen cpkopiere, wird der Zeitstempel der kopierten Datei auf den Zeitpunkt der Kopie gesetzt.

Gibt es eine Möglichkeit, dies zu vermeiden?

Ich muss Dateien kopieren, ohne deren Zeitstempel zu ändern.

Laser
quelle

Antworten:

103

cp -pmacht den Trick. Für Linux :

-p gleich wie --preserve=mode,ownership,timestamps

Für FreeBSD :

-p Veranlassen Sie cp, die folgenden Attribute jeder Quelldatei in der Kopie beizubehalten: Änderungszeit, Zugriffszeit, Dateiflags, Dateimodus, ACL, Benutzer-ID und Gruppen-ID, wie durch Berechtigungen zugelassen.

Und für OS X :

-pVeranlassen Sie cp, die folgenden Attribute jeder Quelldatei in der Kopie beizubehalten: Änderungszeit, Zugriffszeit, Dateiflags, Dateimodus, Benutzer-ID und Gruppen-ID, wie durch Berechtigungen zugelassen. Zugriffssteuerungslisten (Access Control Lists, ACLs) und erweiterte Attribute (Extended Attributes, EAs), einschließlich Ressourcengabeln, werden ebenfalls beibehalten.

Arjan
quelle
25
cp -a ist auch gut zu wissen, es impliziert nicht nur -p, sondern auch -R, um ganze Verzeichnisse zu kopieren und -d, um Links beizubehalten.
casualuser
2
Beachten Sie jedoch, dass bei Verwendung von GNU Coreutils cp -pnicht nur der Zeitstempel, sondern auch der Modus und der Besitz sowie unter FreeBSD neben der Änderungszeit auch die Zugriffszeit, die Dateiflags, der Dateimodus, die Zugriffssteuerungsliste, die Benutzer-ID und die Gruppen-ID erhalten bleiben, sofern dies zulässig ist nach Berechtigungen. «und unter OS X zusätzlich» Erweiterte Attribute, einschließlich Ressourcengabeln «.
Stefan Schmidt,
Auf der neuesten OSX-
Version
15

Wenn Sie cpvon GNU Coreutils aus verwenden , um nur die Zeitstempel und keine Attribute wie Benutzer-ID, Gruppen-ID oder Dateimodus beizubehalten , können Sie mit der Langschrift --preserveeine Liste der beizubehaltenden Attribute explizit angeben.

cp --preserve=timestamps source destination

Beachten Sie jedoch, dass diese Syntax von anderen Unices wahrscheinlich nicht unterstützt wird. Eine Alternative könnte sein, den --timesParameter zu verwenden, der für rsyncdie meisten Installationen verfügbar sein sollte.

Stefan Schmidt
quelle
4
Das ist die richtige Antwort. Verwenden -pist nicht die richtige Antwort. -pbehält auch das Eigentum und den Modus. Was vielleicht nicht gewollt ist .. und nicht in Frage gestellt wurde.
bshea
10

Auf einem Unix-Dateisystem gibt es drei Zeiten: die Zugriffszeit (atime), die Änderungszeit (mtime) und die Inode-Änderungszeit (ctime). Sie können die Zugriffszeit und die Änderungszeit beispielsweise mit dem Touch-Programm ändern

cp orig copy
Berühren Sie -r Originalkopie

Sie können die Inode-Änderungszeit jedoch nicht ändern.

Gorilla
quelle
1
Informationen
0

Ich musste vor kurzem etwas Ähnliches tun, aber stattdessen Symlink verwenden. So erstellen Sie einen Symlink und behalten den ursprünglichen Zeitstempel bei:cp -ps src_file dst_symlink

fduff
quelle
Als Kommentar könnte dies für einige Leser nützlich sein, als Antwort fügt es den meisten Lesern Rauschen hinzu.
Ndemou