rsync exclude katalog nie działa

Używam Fedory 17 w wersji 64-bitowej, a rsync --exclude=/home/ben/<dir> nie działa zgodnie z oczekiwaniami .

Próbuję rsync mój katalog domowy na pendrive, ale z pewnością chcę wykluczyć katalogi, które przechowują pliki pamięci podręcznej i pliki kompilacji. To jest polecenie, którego używam:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home/ben home-ben/ 

Jednak treść z ~/build i jest kopiowany przez rsync. Co robię źle?

Komentarze

  • Myślę, że wykluczanie wzorców po prostu nie ' nie działa.

Odpowiedź

Globalne rsync reguły filtrowania rozpoczynające się od początkowego / zakotwiczone w katalogu głównym cytat z sekcji „INCLUDE / EXCLUDE PATTERN RULES” na stronie podręcznika:

jeśli wzorzec zaczyna się od /, to jest zakotwiczony w określone miejsce w hierarchii plików, w przeciwnym razie jest dopasowywane do końca nazwy ścieżki. Jest to podobne do początkowego znaku ^ w wyrażeniach regularnych. Zatem „/ foo” będzie pasowało do nazwy „foo” w „katalogu głównym transfer ”(dla reguły globalnej) lub w katalogu pliku scalającego (dla regułę dla każdego katalogu).

W Twoim poleceniu (rsync ... -arv /home/ben home-ben/) plik zostanie przeniesiony do home-ben/ben/foo. Katalog główny transferu to home-ben, a prawidłowa ścieżka filtru to /ben/foo. Dlatego

  • aby dopasować /home/ben/.ccache, potrzebujesz ścieżki filtra /ben/.ccache
  • aby dopasować /home/ben/build/ potrzebujesz ścieżki filtra /ben/build/

Bardziej szczegółowe wyjaśnienie można znaleźć można znaleźć w sekcji „ANCHORING INCLUDE / EXCLUDE PATTERNS” na stronie rsync(1) podręczniku .


Zwróć uwagę, że samo pominięcie początkowego / niekoniecznie jest tym, czego potrzebujesz. Cytując ponownie z tej samej sekcji strony podręcznika:

Niekwalifikowane „foo” pasowałoby do nazwy „foo” w dowolnym miejscu w drzewie, ponieważ zastosowano algorytm rekurencyjnie od góry do dołu; zachowuje się tak, jakby każdy składnik ścieżki otrzymał obrót na końcu nazwy pliku. Nawet niezakotwiczone „sub / foo” pasowałoby w dowolnym punkcie hierarchii, gdzie „foo” zostało znalezione w katalogu o nazwie „sub”. Zobacz sekcję KOTWIENIE WŁĄCZA / WYKLUCZAJ WZORY, aby uzyskać pełne omówienie sposobu określania wzorca pasującego do początku transferu.

Zatem wzorzec filtru build/ będzie pasował do katalogu kompilacji w dowolnym miejscu w /home/ben, nawet /home/ben/many/sub/directories/build/.

Komentarze

  • Najważniejsze jest to, że ukośniki mają znaczenie . Jeśli dodasz ukośnik na końcu katalogu źródłowego (rsync -a źródło / miejsce docelowe), skopiuje on zawartość źródła, w przeciwnym razie rsync -a source destination skopiuje sam katalog źródłowy do miejsca docelowego. Określa to, jaki będzie korzeń transferu w celu poinformowania wyrażenia wykluczającego. Prawidłowe użycie / w wyrażeniu wykluczającym zostało następnie wyjaśnione powyżej. Zwróć w szczególności uwagę, że rsync --exclude='/dir1' source destination wygrał ' niczego nie wyklucza.

Odpowiedź

OSTRZEŻENIE: Za komentarz @ rubo77 „poniżej , tej odpowiedzi należy używać tylko wtedy, gdy chcesz wykluczyć te elementy w całym drzewie źródłowym, a nie tylko w katalogu głównym. Zobacz odpowiedź @ jw013 powyżej, aby uzyskać dokładniejsze wyjaśnienie.

Myślę, że ścieżki exclude muszą być względne w stosunku do ścieżki źródłowej. zamiast tego spróbujesz tego?

rsync --exclude=build/ --exclude=.ccache -arv /home/ben home-ben/ 

Oto test dla porównania:

/tmp$ tree src dest src ├── a └── b dest └── foo/ /tmp$ rsync -nav --exclude /tmp/src/b /tmp/src /tmp/dest sending incremental file list src/ src/a src/b $ rsync -nav --exclude b /tmp/src /tmp/dest sending incremental file list src/ src/a 

Komentarze

  • Ta odpowiedź jest nieprawidłowa. Ze względną ścieżką wykluczania wykluczyłbyś wzorzec wszędzie!
  • Ten post jest poprawny. Dopasowywanie jest oparte na tekście, a nie na i-węźle pliku. Niezależnie od ścieżki wyświetlanej przez polecenie --verbose jest formatem, którego musisz użyć.
  • To zadziałało.
  • A jeśli ścieżka źródłowa to ' / ', to bezwzględne są ścieżkami względnymi, ale nadal nie ' t działa.
  • To jedyna rzecz, która mi pomogła.

Odpowiedź

Twój wzorzec wykluczania zadziała, jeśli zsynchronizujesz całą ścieżkę / home, tjbez końcowego ukośnika:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home home-all/ 

Ale lepiej tylko rsynchronizuj zawartość folderu z końcowym ukośnikiem:

rsync --exclude=/build --exclude=/.ccache -arv /home/ben/ home-ben/ 

Możesz także użyć listy ignorowanych, zobacz: https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders

Odpowiedź

Miałem ten problem w skrypcie (nie wiem, czy to Twój przypadek). Byłem, ponieważ użyłem tego polecenia w skrypcie i używałem sh zamiast bash. sprawdź shebang na początku swojego skryptu.

Komentarze

  • W jaki sposób wybór powłoki interpretera powłoki spowodowałby ten konkretny problem?

Odpowiedź

Aby wykluczyć określony folder za pomocą rsync, należy wziąć pod uwagę względną ścieżkę w poleceniu. w Twoim przypadku:

rsync --exclude=/ben/build/ --exclude=/ben/.ccache -arv /home/ben home-ben/ 

gdzie „ben” to folder, który synchronizujesz

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *