Obsługa plików lub katalogów o zmienionych nazwach w rsync

26

Pracuję nad rsyncskryptem do replikacji katalogu. Synchronizuję tylko nowe i zmodyfikowane pliki lub katalogi, ale nie podoba mi się to, że kopiuje pliki lub katalogi o zmienionych nazwach jako nowy plik lub katalog, co powoduje, że pliki nie są zsynchronizowane. Ustawiłem również limit przepustowości 1 MB, ponieważ będzie on działać w godzinach pracy. Oto mój skrypt:

rsync -zvru --bwlimit=1024  /mymounts/test1/ /mymounts/test2

Jak mogę zsynchronizować pliki i katalogi, jeśli ktoś coś zmieni nazwę, nadal kopiując tylko nowe lub zmodyfikowane pliki? Oto pliki, o których mowa

ls "/mymounts/test1/some stuff"
new directory  newfile1.txt  newfile3.txt  renamedFile.txt

ls "/mymounts/test2/some stuff"
new directory  newfile1.txt  newfile2.txt  newfile3.txt  renamedFile.txt

Czy byłby sposób na przeniesienie plików o zmienionych nazwach do innego katalogu, powiedz /mymounts/VerControl:?

jmituzas
źródło

Odpowiedzi:

23

Możesz obsługiwać pliki przeniesione i o zmienionych nazwach, rsyncjeśli systemy plików w katalogu źródłowym i docelowym obsługują twarde łącza. Chodzi o to, aby rsync zrekonstruował twarde linki przed rzeczywistym transferem. Można znaleźć świetny wyjaśnienie tutaj .

Skończyło się na prostym rozwiązaniu, które tworzy ukryte drzewo twardych linków w katalogu źródłowym / docelowym, podstawowy skrypt może wyglądać tak:

# Name of hidden directory
Shadow=".rsync_shadow"

# do real sync
rsync -ahHv --stats --no-inc-recursive --delete --delete-after "$Source"/ "$Target"

# update/create hidden dir of hard links in source
rsync -a --delete --link-dest="$Source" --exclude="/$Shadow" "$Source"/ "$Source/$Shadow"

# update/create hidden dir of hard links in target
rsync -a --delete --link-dest="$Target" --exclude="/$Shadow" "$Target"/ "$Target/$Shadow"

Mam przykładowy skrypt na GitHub . Ale radzę przeprowadzić dużą ilość testów przed użyciem tej metody w produkcji.

dparoli
źródło
Również „genialne wyjaśnienie”, do którego prowadzi link, odnosi się również do tego wspaniałego podstawowego rsyncartykułu, FWIW. everythinglinux.org/rsync
JakeGould
19

Możesz spojrzeć na -y | --fuzzyopcję rsync. Poza tym rsync nie ma możliwości śledzenia zmian nazw, więc ostatecznie przeniesiesz plik o zmienionej nazwie.

Ze strony rsync:

   -y, --fuzzy
          This option tells rsync that it should look for a basis file for
          any  destination  file  that  is missing.  The current algorithm
          looks in the same directory as the destination file for either a
          file  that  has  an identical size and modified-time, or a simi-
          larly-named file.  If found, rsync uses the fuzzy basis file  to
          try to speed up the transfer.
artyom
źródło
7
Zauważ, że jeśli używasz --fuzzy, powinieneś rozważyć połączenie go --delete-delay, ponieważ „rsync domyślnie robi a --delete-before, usuwając w ten sposób plik podstawowy, zanim będzie można go skopiować / przenieść” . Źródło: Sonia Hamilton
Ronan Jouchet
1

Nie możesz

Rsync ma trzy tryby,

  • Skopiuj wszystkie pliki
  • Skopiuj istniejące (zmodyfikowane / niezmodyfikowane) pliki - na tym masz wiele opcji
  • Skopiuj nieistniejące pliki.

Jednak te trzy tryby mają dwie podkategorie,

  • Wyklucz na
  • Uwzględnij na

Rsync nie śledzi nazw plików, nie ma stanu. Zamiast tego rozważ skopiowanie wszystkich plików i wykluczenie tych, których nie chcesz. Nie możesz mieć ruchomej białej listy, możesz mieć czarną listę.

rsync [..stuff..] --exclude 'lib/'
Evan Carroll
źródło
gotcha dzięki za dane wejściowe będą musiały żyć z plikami o zmienionej nazwie.
jmituzas
Możesz usunąć pliki, które nie istnieją, to w porządku. Ale jako funkcja kopiowania, jeśli zmienisz nazwę w źródle, skopiuje plik o zmienionej nazwie.
Evan Carroll
Mogę zachować wersje z opcją -b i ustawić sufiks = i date +%Y%m%d%k%M%Stak mogę uzyskać sufiks = date +%Y%m%d%k%M%S.ORIGINALSUFFIX?
jmituzas
0

O ile mi wiadomo, rsyncnie mogę rozpoznać zmiany nazw plików Nowe pliki będą musiały zostać ponownie przesłane. Zobacz odpowiedź artyoma .

Aby usunąć utracone pliki, użyj --deleteopcji.

Ponadto do tworzenia kopii lustrzanych polecam użycie -a( archiwum ), które aliasuje kilka fajnych opcji.

Zobacz man 1 rsyncszczegóły.

Lukas
źródło
dzięki, że zadziała --delete / mymounts / test1 / / mymounts / test2 /
jmituzas