Skopiowałem już terabajty plików, rsync
ale zapomniałem użyć, --archive
aby zachować specjalne atrybuty plików.
rsync
Tym razem próbowałem wykonać ponownie, --archive
ale było to o wiele wolniejsze niż się spodziewałem. Czy jest jakiś prosty sposób, aby zrobić to szybciej, po prostu kopiując rekurencyjnie metadane?
filesystem
rsync
metadata
Mohammad
źródło
źródło
Odpowiedzi:
Ok, można skopiować właściciela, grupy i uprawnienia znaczników czasu za pomocą
--reference
parametru nachown
,chmod
,touch
. Oto skrypt, aby to zrobićPowinieneś go uruchomić z
sudo
(aby umożliwić przeglądanie) i dwoma parametrami: katalog źródłowy i docelowy. Skrypt odzwierciedla tylko to, co by zrobił. Jeśli jesteś zadowolony, zmień linię zamyecho=echo
pomocąmyecho=
.źródło
touch --reference=otherfile file
. Zaktualizowano odpowiedźtouch
z założenia zmienia tylko czasy modyfikacji i dostępu, czas „tworzenia” nie ma wpływu. (Myślę, że ext2 / 3 i tak nie obsługuje zmiany ctime, ale może mieć znaczenie, jeśli używasz NTFS lub podobnego).-c
przełącznik dotouch
polecenia, aby zatrzymać tworzenie pustych plików w pliku$dst_path
.OSTRZEŻENIE: Bez specjalnych obejść GNU
cp --attributes-only
obetnie pliki docelowe, przynajmniej w Precise. Zobacz edycję poniżej.Oryginalny:
W tej sytuacji prawdopodobnie chcesz opcji GNU cp
--attributes-only
, wraz z--archive
wypróbowanym i przetestowanym kodem, robi wszystkie atrybuty niezależne od systemu plików i nie podąża za dowiązaniami symbolicznymi (podążanie za nimi może być złe!):Podobnie jak w przypadku plików,
cp
jest addytywny z rozszerzonymi atrybutami: jeśli zarówno źródło, jak i miejsce docelowe mają atrybuty rozszerzone, dodaje rozszerzone atrybuty źródła do miejsca docelowego (zamiast najpierw usuwać wszystkie xattry miejsca docelowego). Chociaż odzwierciedla tocp
zachowanie w przypadku kopiowania plików do istniejącego drzewa, może nie być to oczekiwane.Zauważ też, że jeśli nie zachowałeś twardych linków za pierwszym razem,
rsync
ale chcesz je teraz zachować, tocp
nie naprawisz tego za ciebie; prawdopodobnie najlepiej będzie,rsync
jeśli ponownie uruchomisz z odpowiednimi opcjami (patrz moja inna odpowiedź ) i będziesz cierpliwy.Jeśli znalazłeś to pytanie podczas celowego rozdzielania i ponownego łączenia zawartości metadanych / plików, możesz rzucić okiem na metastore, który znajduje się w repozytoriach Ubuntu.
Źródło: Podręcznik GNU coreutils
Edytowano, aby dodać:
cp
od GNUcoreutils
> = 8.17 i nowszych będzie działać zgodnie z opisem, ale coreutils <= 8.16 obetnie pliki podczas przywracania ich metadanych. W razie wątpliwości nie używajcp
w tej sytuacji; używajrsync
z odpowiednimi opcjami i / lub bądź cierpliwy.Nie poleciłbym tego, chyba że w pełni rozumiesz, co robisz, ale wcześniejszym GNU
cp
można zapobiec obcinaniu plików za pomocą sztuczki LD_PRELOAD :źródło
errorno
powinno byćerrno
, prawda?rsync
odpowiednimi opcjami, jest odpowiedzią na inne pytanie ...Traktując to pytanie jako „rsync ma tylko metadane do skopiowania, więc dlaczego jest tak wolny i jak mogę go przyspieszyć?”:
rsync
zwykle używa równych czasów jako heurystyki do wykrywania i pomijania niezmienionych plików. Bez--archive
(konkretnie bez--times
) mity plików docelowych pozostają ustawione na czas, kiedy je synchronizujesz, podczas gdy mity plików źródłowych pozostają nienaruszone (ignorując twoje ręczne oszustwo). Bez zewnętrznych gwarancji od ciebie, że zawartość plików źródłowych nie uległa zmianie, rsync musi założyć, że tak się stało, i dlatego musi je zsumować i / lub ponownie skopiować do miejsca docelowego. To plus fakt, który--whole-file
jest sugerowany dla lokalnych-> lokalnych synchronizacji, czynirsync
bez w--times
przybliżeniu równoważnymcp
dla lokalnych synchronizacji.Pod warunkiem, że aktualizacja zawartości plików docelowych jest akceptowalna lub jeśli pliki źródłowe są nietknięte od oryginalnej kopii, powinieneś znaleźć
rsync --archive --size-only
szybciej niż naiwny rsync.W razie wątpliwości co do tego, co
rsync
trwa tak długo,rsync --archive --dry-run --itemize-changes ...
powiedzą Ci wyczerpujące, jeśli zwięzłe, szczegóły.źródło
W transferach lokalnych, gdy źródło i miejsce docelowe znajdują się w lokalnie zamontowanych systemach plików,
rsync
zawsze będą kopiować całą zawartość plików. Aby tego uniknąć, możesz użyćźródło
rsync
nie używać skrótu, gdy oba pliki znajdują się w ścieżce lokalnej, ale nie zapobiegarsync
kopiowaniu zawartości.Musiałem to zrobić zdalnie na innym komputerze, więc nie mogłem użyć - odniesienia
Użyłem tego, aby skrypt ...
find -printf "touch -d \"%Tc\" \"%P\"\n" >/tmp/touch.sh
Ale najpierw upewnij się, że nie ma w nich żadnych nazw plików z „…
find | grep '"'
Następnie skopiuj touch.sh na komputer zdalny i uruchom ...
cd <DestinationFolder>; sh /tmp/touch.sh
Istnieją również opcje w find -printf, aby wydrukować użytkownika, nazwę grupy, jeśli chcesz je skopiować.
źródło
find
. Byłem w tej samej sytuacji - zapomniałem skopiować atrybuty, dyski źródłowy i docelowy były już na różnych komputerach i tak naprawdę nie chciałem tego odwracać.