rsync nie synchronizuje pliku .htaccess

91

Próbuję rsync katalog A serwera1 z katalogiem B serwera2.

Siedząc w katalogu A serwera server1, uruchomiłem następujące polecenia.

rsync -av * server2::sharename/B

ale interesującą rzeczą jest to, że synchronizuje wszystkie pliki i katalogi z wyjątkiem .htaccess lub dowolnego ukrytego pliku w katalogu A. Wszelkie ukryte pliki w podkatalogach są synchronizowane.

Wypróbowałem również następujące polecenie:

rsync -av --include=".htaccess" * server2::sharename/B

ale wyniki są takie same.

Wszelkie pomysły, dlaczego ukryte pliki katalogu A nie są synchronizowane i jak to naprawić. Pracuję jako użytkownik root.

dzięki

Sangfroid
źródło
1
Jestem zadowolony z jednej odpowiedzi, powinieneś ją zaakceptować: meta.stackexchange.com/questions/5234/ ...
Kutzi

Odpowiedzi:

109

Wynika to z faktu, że *jest on domyślnie rozszerzany na wszystkie pliki w bieżącym katalogu roboczym, z wyjątkiem plików, których nazwa zaczyna się od kropki. Dlatego rsyncnigdy nie otrzymuje tych plików jako argumentów.

Możesz przekazać .oznaczenie bieżącego katalogu roboczego do rsync:

rsync -av . server2::sharename/B

W ten sposób rsyncbędzie szukać plików do przesłania w bieżącym katalogu roboczym, zamiast szukać ich w tym, co się *rozwija.

Alternatywnie możesz użyć następującego polecenia, aby *rozwinąć wszystkie pliki, w tym te, które zaczynają się kropką:

shopt -s dotglob

Zobacz także stronę podręcznika shopt .

Adam Zalcman
źródło
7
W rzeczy samej '.' rozwiązuje problem, np. rsync -avz [email protected]:/remote/path/. /destination/pathwykonuje robotę
Mariusz Nowak
57

Dla każdego, kto tylko próbuje katalogów synchronizacji między serwerami (w tym wszystkie ukryte pliki) - np synchronizacja somedirAna source-servercelu somedirBna serwerze docelowym - spróbuj tego :

rsync -avz -e ssh --progress user@source-server:/somedirA/ somedirB/

Zwróć uwagę na ukośniki na końcu obu ścieżek. Każda inna składnia może prowadzić do nieoczekiwanych wyników!


Ponadto, dla mnie najłatwiej jest wykonać rsyncpolecenia z serwera docelowego, ponieważ łatwiej jest upewnić się, że mam odpowiednie uprawnienia do zapisu (tj. Może być konieczne dodanie sudodo powyższego polecenia).

Prawdopodobnie jest to oczywiste, ale oczywiście twój zdalny użytkownik również potrzebuje dostępu do odczytu somedirAna serwerze źródłowym. :)

Brian Lacy
źródło
Czy to flaga -e zsynchronizuje .htaccessplik?
Jesse Burcsik
1
@JesseBurcsik Nie, -e sshokreśla metodę łączenia.
tripleee
1
Potrzebujesz tylko slash na źródle, cel nie ma znaczenia
Jonas Stensved
28

Miałem ten sam problem.

U mnie, gdy wykonałem następujące polecenie, ukryte pliki nie zostały zsynchronizowane

rsync -av /home/user1 server02:/home/user1

Ale kiedy dodałem ukośniki na końcu ścieżek, ukryte pliki zostały zsynchronizowane.

rsync -av /home/user1/ server02:/home/user1/

Zwróć uwagę na cięcia na końcach ścieżek , ponieważ Brian Lacy powiedział, że są one kluczem. Nie mam reputacji, by komentować jego post, bo inaczej bym to zrobił.

harleygolfguy
źródło
1
Po prostu dodaj shopt -s dotglobdo swojego skryptu przed rsync
Pian0_M4n
3

Myślę, że problem jest spowodowany rozszerzaniem się symboli wieloznacznych powłoki. Posługiwać się . zamiast gwiazdy.

Rozważ następującą przykładową zawartość katalogu

$ ls -a .
. .. .htaccess a.html z.js

Rozwijanie symboli wieloznacznych powłoki tłumaczy listę argumentów, z której pobiera program rsync

-av * server2::sharename/B

w

-av a.html z.js server2::sharename/B

zanim polecenie zacznie być wykonywane.

vkraemer
źródło
3

*Tell do rsynch aby nie synchronizować pliki ukryte. Nie powinieneś tego pomijać.

DonCallisto
źródło