Mam około 50 plików w różnych podkatalogach, które chciałbym przesłać na zdalny serwer. Pomyślałem, że rsync będzie w stanie to dla mnie zrobić, używając opcji --include-from. Bez opcji --exclude = "*" wszystkie pliki w katalogu są synchronizowane, z opcją żadne pliki nie są synchronizowane.
rsync -avP -e ssh --include-from=deploy/rsync_include.txt --exclude=* ./ [email protected]:/var/www/ --dry-run
Uruchamiam go jako suchy początkowo i 0.0.0.0 jest oczywiście zastępowane przez adres IP zdalnego serwera. Zawartość rsync_include.txt to lista oddzielonych wierszami ścieżek względnych do plików, które chcę przesłać.
Czy jest lepszy sposób na to, że ucieknie mi w poniedziałek rano?
rsync --files-from
jest to prawdopodobnie łatwiejsze i bardziej niezawodne rozwiązanie :)Jest flaga,
--files-from
która robi dokładnie to, co chcesz. Odman rsync
:źródło
rsync -av --files-from=file-list . target/
do kopiowania plików z bieżącego katalogu.The filenames that are read from the FILE are all relative to the source dir
...
rsync, wydaje się, że ignoruje..
błąd, taki jakrsync: link_stat "/home/michael/test/subdir/test.txt" failed: No such file or directory
(w tym przypadku uruchomienie z katalogu "test" i próba określenia "../subdir/test.txt", który istnieje.--files-from
argument można połączyć z jawną listą--files-from
włączeń i wykluczeń i czy pliki z listy dodane z nadpisaniem istniejących reguł wykluczania, tak że zostaną uwzględnione, jeśli pojawią się w pliku?--files-from=
parametr wymaga końcowego ukośnika, jeśli chcesz zachować bezwzględną ścieżkę nienaruszoną. Więc twoje polecenie zmieniłoby się w coś takiego jak poniżej:Można to zrobić tak, jakby istniała duża liczba plików i chcesz skopiować wszystkie pliki do ścieżki x. Więc znalazłbyś pliki i wyrzucił dane wyjściowe do pliku takiego jak poniżej:
źródło
Dla przypomnienia, żadna z powyższych odpowiedzi nie pomogła poza jedną. Podsumowując, możesz wykonać operację tworzenia kopii zapasowej za
--files-from=
pomocą:LUB
To pierwsze polecenie jest oczywiste, poza treścią pliku,
rsync-src-files
który omówię poniżej. Teraz, jeśli chcesz korzystać z drugiej wersji, musisz pamiętać o następujących czterech uwagach:--files-from
i katalog źródłowy--recursive
.rsync-src-files
jest plikiem utworzonym przez użytkownika i został umieszczony w katalogu src na potrzeby tego testursyn-src-files
Zawierać pliki i foldery do skopiowania i są podejmowane w stosunku do katalogu źródłowego. WAŻNE: upewnij się, że w pliku nie ma końcowych spacji ani pustych wierszy. W poniższym przykładzie są tylko dwie linie, a nie trzy (zorientuj się przypadkowo). Treśćrsynch-src-files
to:nazwa_folderu1
nazwa_folderu2
źródło
Dostałem podobne zadanie: rsync wszystkie pliki zmodyfikowane po podanej dacie, ale z wyłączeniem niektórych katalogów. Trudno było zbudować jeden liniowy styl all-in-one, więc podzieliłem problem na mniejsze części. Ostateczne rozwiązanie:
Najpierw używam
find -L ~/sourceDIR -type f -newermt "DD MMM YYYY HH:MM:SS"
. Próbowałem dodaćregex
dofind
wiersza, aby wykluczyć wzorce nazw, jednak mój smak Linuksa (Mint) wydaje się nie rozumieć negacji wyrażenia regularnegofind
. Wypróbowana liczba smaków wyrażenia regularnego - nie działa zgodnie z oczekiwaniami. Skończyło się naegrep -v
opcji, która wyklucza łatwy sposób tworzenia wzoru. Mójrsync
nie kopiuje katalogów takich jak /.cache czy /.config plus kilka innych, które wyraźnie wymieniłem.źródło
bash
rsync -v --files-from=<(find ~/sourceDIR -type f -newermt "DD MMM YYYY HH:MM:SS" | grep -Ev "/\..|Downloads|FOO") ~/sourceDIR /Destination
Składnia:
rsync <file_/_folder_list> <source> <target>
Nazwy folderów (tutaj z końcem
/
; np.Cancer - Evolution/
) Znajdują się w pliku listy folderów (np .: cm_folder_list_test):Jeśli nie uwzględnisz tych końcowych
/
, foldery docelowe rsync zostaną utworzone, ale będą puste.Te nazwy folderów są dołączane do reszty ich path (
/home/victoria/Mail/2_RESEARCH - NEWS
), zapewniając w ten sposób pełną ścieżkę folderu do rsync; np/home/victoria/Mail/2_RESEARCH - NEWS/Cancer - Evolution/
. : .Pamiętaj, że musisz również użyć
--files-from=
..., NOT--include-from=
...rsync -aqP --delete --files-from=/mnt/Vancouver/projects/ie/claws/data/cm_folder_list_test "/home/victoria/Mail/2_RESEARCH - NEWS" $IN/
(W moim skrypcie BASH zdefiniowałem zmienną
$IN
w następujący sposób.)użyte opcje rsync:
źródło
Ta odpowiedź nie jest bezpośrednią odpowiedzią na pytanie. Powinien jednak pomóc Ci ustalić, które rozwiązanie najlepiej pasuje do Twojego problemu.
Analizując problem, należy aktywować opcję debugowania
-vv
Następnie rsync wyświetli, które pliki są uwzględnione lub wykluczone według którego wzorca:
źródło
Żadna z tych odpowiedzi nie zadziałała dla mnie, kiedy jedyne, co miałem, to lista katalogów . Wtedy natknąłem się na rozwiązanie! Musisz dodać
-r
do,--files-from
ponieważ-a
w tym scenariuszu nie będzie rekurencyjny (kto wie ?!).źródło