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 /
są 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ę, żersync --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