rsync nierekurencyjnie kopiuje zawartość katalogu

8

Próbuję nierekurencyjnie skopiować zawartość serii katalogów do innego zdalnego systemu.

/dirA/dir1/file
/dirA/dir2/file
/dirA/dir3/file

katalog1, katalog2 i katalog3 zawierają wiele katalogów, których nie chcę kopiować. Skopiuj na zdalnym hoście do / dirB, zachowując tę ​​samą strukturę katalogów.

Próbowałem:

rsync /dirA/*/ host:/dirB/
rsync /dirA/   host:/dirB/

Ale nie robią tego, co chcę.

Felipe Alvarez
źródło

Odpowiedzi:

20

rsync pozwala określić wzorce, które wyzwalają dołączanie lub wykluczanie plików i katalogów. Myślę, że chcesz użyć czegoś takiego:

rsync -a -f '- /*/*/' /dirA/ host:/dirB/

Wyjaśnienie:

  • -auruchamia tryb archiwizacji, który aktywuje zarówno rekurencję, jak i zachowanie „dowiązań symbolicznych, urządzeń, atrybutów, uprawnień, praw własności itp.”, zgodnie z man rsync.
  • -fjest skrótem od --filter=, który dodaje regułę filtrowania plików.
    • Wzór znajduje się w pojedynczych cudzysłowach, aby powłoka nie rozwijała symboli wieloznacznych; podwójne cudzysłowy działałyby równie dobrze w tym przypadku.
    • - oznacza, że ​​jest to wzór wykluczający.
    • Prowadzenie /oznacza, że ​​wzorzec musi zaczynać się od dirA/(rsync „transfer-root”).
    • */*Część wzoru odnosi się do dowolnego elementu wewnątrz podkatalogu.
    • Trailing /ogranicza wykluczenie do katalogów. Pliki w podkatalogu dirA/nie ulegają zmianie.

Na koniec rsync kopiuje tylko jeden poziom niżej (a także nie tworzy katalogów drugiego poziomu).

Proszę wstać
źródło
2
Bardzo dobrze! Byłem w stanie -f '- /*/'ograniczyć tylko do plików najwyższego poziomu. Musiałem także określić, -f '- .*'aby wykluczyć pliki kropkowe, ponieważ synchronizowałem katalog domowy.
haridsv
5

Powyższe rozwiązanie (autorstwa PleaseStand) nie działało dla mnie z jakiegoś powodu. Działa to jednak:

rsync -avc --no-r ./source/* ./destination/

Istnieje również ten alternatywny:

rsync -avc --exclude "/" ./source/ ./destination/

Andrei Pokrovsky
źródło
1

Jedną z „cech” rsync jest sposób parsowania katalogów.

rsync /dirA/ host:/dirB/ i rsync /dirA host:/dirB teoretycznie powinny być równoważne.

Ponieważ nie chcesz zachęcać do rekurencyjności, chcesz tego uniknąć -r, -aco oprócz innych rzeczy implikuje -r.

Nadal nie do końca skończyłem badania, ale to moja początkowa odpowiedź.

killermist
źródło