jak powiedzieć rsync, aby zachowywał znacznik czasu w plikach, gdy drzewo źródłowe ma zamontowany punkt

42

Powiązane z tym pytaniem

Krótki opis problemu:

Gdy drzewo źródłowe ma zamontowany punkt w środku, znaczniki czasu na plikach wewnątrz tego zamontowanego punktu po skopiowaniu do drzewa docelowego nie są zachowywane, nawet przy użyciu -aopcji

Szczegółowy opis:

Załóżmy, że to drzewo źródłowe:

                       /home/                           /home/
                         |                                |
                        me/                             BACKUP/
                         |                                |
                    +----+----------+                +----+-------+
                    |    |          |                |    |       |
                 data/  foo.txt    boo.txt         data/ foo.txt boo.txt
                    |                                |
                   a.txt                           a.txt

gdzie data/powyżej jest zamontowany zewnętrzny dysk USB. Wszystko jest ext4systemem plików. Wszystko w źródle jest własnością mojej me.

BACKUP okazało się również, że jest to punkt montowania, zapasowy dysk USB.

Po wydaniu tego polecenia rsync -av --delete /home/me/ /home/BACKUP/znalazłem, że /home/BACKUP/data/i wszystko pod nim ma bieżący znacznik czasu, tak jakby te pliki zostały teraz utworzone, a nie znacznik czasu na plikach w /home/me/data/. Inne pliki i foldery na zewnątrz datamiały zachowany znacznik czasu OK.

Pytanie brzmi: jak użyć rsyncw powyższym ustawieniu, aby zachować znaczniki czasu na wszystkich plikach i folderach, nawet na plikach i folderach w zamontowanym punkcie?

Ja używam:

>uname -a
Linux 3.5.0-17-generic #28-Ubuntu SMP x86_64 x86_64 x86_64 GNU/Linux

>rsync -v
rsync  version 3.0.9  protocol version 30
Nasser
źródło

Odpowiedzi:

46

z man rsync:

   -t, --times                 preserve modification times

EDYCJA - aby poprawić tę odpowiedź, ponieważ nie jest od razu oczywiste, dlaczego to nie pomogło OP:

OP kopiuje pliki z jednego systemu plików do drugiego i chce zachować c-time. Większość ludzi rozumie, c-timeże oznacza „czas tworzenia”, który jest niepoprawny w większości systemów UNIX / Linux (systemy plików Windows śledzą czasy „tworzenia” lub „narodzin”).

W przeważającej części, w systemach UNIX i Linux, c-timeznacznik czasu używany do rejestrowania ostatniego zmiany i-węzła „ C ”. I-węzeł zmienia się, jeśli którykolwiek z jego atrybutów zostanie zaktualizowany:

OP nie może zachować c-timeswoich plików, gdy zostaną przeniesione do nowego systemu plików. Utworzenie tych plików w nowych systemach plików jest jednym z wyżej wymienionych warunków (utworzenie i-węzła / pliku).

/EDYTOWAĆ

h3rrmiller
źródło
9
Dziękuję Ci. Wiem to. Ale proszę uważnie przeczytaj pytanie. Nie korzystałem -a, który mówi: archive mode; equals -rlptgoD dla nich -tjest już włączone.
Nasser
1
próbujesz zaoszczędzić czas na zmianę? ctime NIE jest dla „utworzonego” dla jego (statusu) zmiany
h3rrmiller
1
Chcę, aby działał tak samo, jak działa na plikach, które nie znajdują się na zamontowanym dysku. tzn. zachowaj ten sam znacznik czasu, który widzisz podczas robienia ls -lpliku. Działa to na plikach, które nie znajdują się w punkcie montowania. Ale wszystkie pliki, które znajdują się w punkcie montowania, mają na sobie znacznik czasu wskazujący, że zostały właśnie utworzone. Jak nazwiesz tym razem. Chciałem tylko, aby używał tego samego znacznika czasu na plikach w źródle. Teraz tak nie jest. Chcę, aby wszystkie aspekty czasu zostały skopiowane. tzn. zostanie utworzony klon pliku. czas tworzenia, zmiana czasu itp.
Nasser
4
czas zmiany (ctime) jest aktualizowany po zmianie i-węzła (tj. tworzenie / zmiana uprawnień / przenoszenie / itp.). ponieważ tworzysz nowy i-węzeł (ponieważ kopiujesz plik przez system plików (osobne tabele i-węzłów)) ctime jest aktualizowany. Nie ma możliwości obejścia tego, ponieważ jest to zmiana i-węzła, a nie pliku. spójrz na en.wikipedia.org/wiki/Stat_(system_call)#ctime
h3rrmiller
3
ls -lpokazuje mtime (modyfikuj) nie ctime
h3rrmiller
6

jak już powiedział hr3miller, -a (lub --archive) jest równe -rlptgoD i zawiera już czas synchronizacji.

Jednak gdy rsync kopiuje dane, np. w przypadku montowania NFS / FAT32 / NTFS, w którym nie powiodło się zachowanie użytkownika i właściciela, rsync nie będzie próbował ustawić czasu. Rsync ostrzeże coś podobnego

rsync: chown "/mnt/backup/postgres/hourly.0/primary/var" failed: Operation not permitted (1)

Dlatego pomiń zachowanie użytkownika i grupy za pomocą

-rlptD

zamiast

-rlptgoD

Używaj tego tylko wtedy, gdy nie zachowujesz właściciela, a grupa jest dla Ciebie opcją. Pamiętaj, że zachowanie dowiązań symbolicznych i innych funkcji może również wywołać to zachowanie. Będziesz musiał przejść przez stronę podręcznika dla każdej funkcji rsync (-r -l -p -t -g -o -D), którą chcesz wykonać kopię zapasową.

użytkownik1283043
źródło
-2

Używam rsync -azi jestem pewien, że oszczędza mi to czas modyfikacji. Teraz dokładnie to sprawdziłem.

Mik
źródło
2
To dlatego, że -a( --archive) obejmuje -t.
heemayl
Jednak nie, ctime nie może być arbitralnie zresetowany. (Przepraszam, początkowo źle zrozumiałem to pytanie)
Mik