Obecnie mam dwa katalogi A / i B /, które są identyczne pod każdym względem, z wyjątkiem znaczników czasu. Dlatego jeśli uruchomię polecenie:
rsync --dry-run -crvv A/ B/
wszystkie pliki są oznaczone jako „uptodate”, a polecenie:
rsync --dry-run -rvv A/ B/
pokazuje, że wszystkie pliki należy skopiować z A / do B /.
Moje pytanie brzmi: biorąc pod uwagę, że wiem, że pliki są identyczne (w odniesieniu do zawartości), to czy jest jakiś sposób (poprzez rsync lub w inny sposób) ustawić znaczniki czasu dla plików w B / tak, aby były identyczne z znacznikami czasu w plikach w A /, bez kopiowania wszystkich plików z A / do B /?
Dzięki
rsync
copy
synchronization
timestamp
artella
źródło
źródło
Odpowiedzi:
Używanie
-t
(zachowaj znaczniki czasu) i--size-only
będzie porównywać pliki tylko pod względem rozmiaru. Jeśli rozmiar się zgadza, rsync nie skopiuje pliku, ale ponieważ-t
jest określony, zaktualizuje znacznik czasu w pliku docelowym bez kopiowania go.Nie używaj
-u
(aktualizuj), ponieważ spowoduje to pominięcie plików, które już istnieją i całkowicie pominie aktualizację znacznika czasu.Miałem problem z pierwotnym niestosowaniem rsync do kopiowania kilku plików na nowy dysk, dlatego znaczniki czasu zostały zaktualizowane do aktualnego czasu. Użyłem poniższego polecenia, aby zsynchronizować wszystko poprawnie w przyzwoitym czasie:
źródło
--existing
aby zapobiec przypadkowym kopiom nowych plików.--archive
(lub-a
) zawiera-r
,-t
i więcej :)Użycie opcji --size-only spowoduje, że rsync pominie porównywanie znaczników czasu plików (a tym samym zawartości pliku), jeśli rozmiary są zgodne. Połączenie tego z --times sklonuje znaczniki czasu w drzewie docelowym.
źródło
Myślę, że rsync jest odpowiednim narzędziem do zrobienia tego, ale jeśli chcesz to zrobić, to może to dać dobry początek.
Możesz uzyskać listę plików ze znacznikami czasu (czasy dostępu) w następujący sposób:
I uzyskaj z niego odpowiednie polecenia aktualizacji czasu:
To nie jest kompletny skrypt, ale dobry początek! :)
źródło
Użyj katalogu źródłowego (np.
/path/to/source
) Jako odniesienia do polecenia dotykowego. Po prostucd
do katalogu docelowego i zróbNie możesz skopiować pod sekundowych znaczników czasu za pomocą rsync (jeszcze).
Działa to również w przypadku katalogów i pseudoplików (wystarczy usunąć lub zmienić
-type f
)źródło
touch -ar
ale to wciąż nie zmienia ctime. Myślę, że to rzadko pożądane.Z pewnością możesz napisać skrypt, który odczytuje znacznik czasu z jednej strony, a następnie używa dotyku, aby ustawić go na tym samym pliku z drugiej strony.
Ale prawdopodobnie zajmie ci to znacznie więcej czasu niż zwykłe zezwolenie rsync na skopiowanie wszystkich plików. Bardzo niewiele danych zostanie faktycznie przesłanych (tylko skróty bloków, jeśli pliki są naprawdę identyczne). Ale pełna zawartość każdego pliku będzie musiała być odczytana przynajmniej z każdej strony. Więc jesteś ograniczony przepustowością dysku lub IOPS, może to chwilę potrwać. Ale nadal prawdopodobnie mniej czasu niż napisanie i przetestowanie skryptu, aby to zrobić.
źródło
Dla osób takich jak ja, które zamierzają zmodyfikować pliki i chcą zachować oryginalny znacznik czasu (np. Aktualizujesz metatagi biblioteki muzycznej).
Opiera się na rozwiązaniu dostarczonym przez Stone. Jednak tutaj o czasie modyfikacji i działającym skrypcie do przywracania znaczników czasu. PIERWSZE wykonaj krok pierwszy, a następnie rozpocznij pracę z plikami.
Zachowaj stare znaczniki czasu . Działa z bieżącego katalogu, wyklucza wszystkie ukryte pliki i zapisuje je w pliku tymczasowym
/tmp/files
. Zawsze możesz zmienić parametry, ale lepiej pozostań,-printf '"%t" "%p"\n'
ponieważ późniejszetouch
polecenie korzysta z tego.find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files
Zmodyfikuj pliki tak, jak chcesz
teraz utwórz plik, który pomoże Ci przywrócić znaczniki czasu:
while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times
I wreszcie zastosuj stare daty do zmodyfikowanych plików
sh job.sh
Zastrzeżenie: działa dla plików ze spacjami, znaków specjalnych, ale na przykład nie ma plików ze
$
znakiem.źródło
read -r line
. Cóż, zawsze korzystaćread
z-r
. Poza tym możesz uniknąć otwieraniajob.sh
każdego pliku. Po prostu umieść przekierowanie na końcu polecenia:while read -r path; do echo touch -a -d $path ; done < /tmp/times > job.sh
Najlepszy sposób na skopiowanie tylko znacznika czasu w systemie Windows:
(Ta wersja Touch jest częścią Win32 Console ToolBox http://www.stevemiller.net/apps/ )
źródło
Podręcznik rsync:
man rsync
wymienia a-t
i-N
switch, być może warto się nimi bawić.źródło
-N
. Dlaczego i tak je polecasz?