Jak skopiować plik w systemie Unix bez zmiany czasu ostatniej modyfikacji?

89

Jeśli skopiuję jakiś plik z jednego miejsca do innego za pomocą cp, znacznik czasu na skopiowanym pliku zostanie ustawiony na czas kopiowania.

Czy jest jakiś sposób, aby tego uniknąć?

Muszę skopiować pliki bez zmiany ich znaczników czasu.

Lazer
źródło

Odpowiedzi:

103

cp -pZrób sztuczkę. W systemie Linux :

-p taki sam jak --preserve=mode,ownership,timestamps

W przypadku FreeBSD :

-p Powoduje, że cp zachowuje następujące atrybuty każdego pliku źródłowego w kopii: czas modyfikacji, czas dostępu, flagi plików, tryb pliku, ACL, identyfikator użytkownika i identyfikator grupy, zgodnie z uprawnieniami.

A dla OS X :

-pPowoduje, że cp zachowuje następujące atrybuty każdego pliku źródłowego w kopii: czas modyfikacji, czas dostępu, flagi plików, tryb pliku, identyfikator użytkownika i identyfikator grupy, zgodnie z uprawnieniami. Listy kontroli dostępu (ACL) i atrybuty rozszerzone (EA), w tym rozwidlenia zasobów, również zostaną zachowane.

Arjan
źródło
25
cp -a jest również miło wiedzieć, oznacza to nie tylko -p, ale także -R do kopiowania całych katalogów i -d w celu zachowania linków.
przypadkowy użytkownik
2
Zauważ jednak, że podczas korzystania z GNU Coreutils cp -pzachowuje nie tylko znacznik czasu, ale także tryb i własność, a na FreeBSD oprócz czasu modyfikacji zachowuje również »czas dostępu, flagi plików, tryb pliku, ACL, identyfikator użytkownika i identyfikator grupy, jak dozwolone na podstawie uprawnień. «oraz w OS X dodatkowo» Rozszerzone atrybuty, w tym rozwidlenia zasobów «.
Stefan Schmidt,
w najnowszym OSX, cp -p wciąż dotyka znacznika czasu pliku źródłowego
afathman
15

W przypadku używania cpz GNU Coreutils , aby zachować tylko znaczniki czasu, a nie atrybuty, takie jak identyfikator użytkownika, identyfikator grupy lub tryb pliku, istnieje długa ręka, --preservektóra pozwala jawnie określić listę atrybutów do zachowania.

cp --preserve=timestamps source destination

Pamiętaj jednak, że ta składnia prawdopodobnie nie jest obsługiwana w innych Uniksach. Alternatywą może być użycie --timesparametru, rsyncktóry powinien być dostępny w większości instalacji.

Stefan Schmidt
źródło
4
To poprawna odpowiedź. Używanie -pnie jest poprawną odpowiedzią. -pzachowuje również własność i tryb. Którego może nie chcieć .. i nie zadawano tego pytania.
bshea
10

Istnieją trzy razy w systemie plików Unix, czas dostępu (atime), czas modyfikacji (mtime) i czas zmiany i-węzła (ctime). Możesz na przykład zmienić czas dostępu i czas modyfikacji za pomocą programu dotykowego

kopia oryginału cp
dotknij -r oryginał

Nie można jednak zmienić czasu zmiany i-węzła.

goryl
źródło
0

Ostatnio musiałem zrobić coś podobnego, ale zamiast tego użyć dowiązania symbolicznego. Aby utworzyć dowiązanie symboliczne i zachować oryginalny znacznik czasu:cp -ps src_file dst_symlink

fduff
źródło
Jako komentarz może to być przydatne dla kilku czytelników, ponieważ w odpowiedzi powoduje hałas dla większości czytelników.
ndemou