Jak RSYNC pojedynczy plik?

95

Obecnie RSyncuję tylko następujące elementy Directories:

* * * * * rsync -avz /var/www/public_html/images root@<remote-ip>:/var/www/public_html

Więc jak mam rsyncjednego pliku podobnego /var/www/public_html/.htaccess?

夏 期 劇場
źródło

Odpowiedzi:

160

Robisz to w taki sam sposób, jak w przypadku katalogu, ale jako źródło określasz pełną ścieżkę do nazwy pliku. W twoim przykładzie:

rsync -avz   --progress  /var/www/public_html/.htaccess root@<remote-ip>:/var/www/public_html/

Jak wspomniano w komentarzach: ponieważ -azawiera recurse , jedna mała literówka może spowodować rozpoczęcie pełnego transferu drzewa katalogów, więc bardziej niezawodnym podejściem może być po prostu użycie go -vzlub zastąpienie go -lptgoD.

Michael Place
źródło
19
Również jeśli wysyłasz tylko jeden plik, możesz chcieć dodać parametr „--progress”, abyś mógł obserwować jego postęp.
JoshStrange
czy to oznacza, że ​​nadal potrzebujesz modułu w rsyncd.conf z katalogiem nad plikiem (np. z opcją odmowy delete), czy możesz przesyłać pliki w dowolne miejsce na serwerze, po prostu określając jego ścieżkę? Strona podręcznika nie jest o tym jasna.
3
-a zawiera rekursywne i nie jest potrzebne w przypadku pojedynczego pliku. Nie jestem pewien, czy użyłbym tej flagi dla pojedynczego pliku, ponieważ może to prowadzić do niezamierzonego zachowania, jeśli nazwa pliku przez przypadek stanie się katalogiem.
redanimalwar
2
--partial --stats --progress << Te flagi są przydatne, jeśli jest to naprawdę duży plik i może wymagać wznowienia po zepsutym transferze.
Ahi Tuna
16

Podstawowa składnia

rsync options source destination

Przykład

rsync -az /var/www/public_html/filename root@<remote-ip>:/var/www/public_html

Czytaj więcej

Techie
źródło
14

Odpowiedź Michaela Place działa świetnie, jeśli względem katalogu głównego zarówno źródła, jak i celu, wszystkie katalogi w ścieżce pliku już istnieją.

Ale co, jeśli chcesz zsynchronizować plik z tą ścieżką źródłową:

/ source-root / a / b / plik

do pliku z następującą ścieżką docelową:

/ target-root / a / b / plik

a katalogi a i b nie istnieją?

Musisz uruchomić polecenie rsync, takie jak następujące:

rsync -r --include="/a/" --include="/a/b/" --include="/a/b/file" --exclude="*" [source] [target]
Kenny Evitt
źródło
2
Czy nie byłoby bezpieczniej po prostu skopiować pojedynczy plik do istniejącego folderu lub utworzyć foldery z wyprzedzeniem? W przypadku synchronizacji zawartości folderów lub folderów rsync stwórzmy wszystkie podfoldery, w końcu to jego praca, ale w tym konkretnym przypadku jest to zbyt kłopotliwe i kłopotliwe z parametrami --include tylko do kopiowania pojedynczych plików.
Tulains Córdova
@ user1598390 Nie jestem pewien, jaki scenariusz zakładasz lub wyobrażasz sobie, gdzie byłoby to mniej bezpieczne, ale gdybyś próbował zapamiętać konkretną formę tego polecenia i nie robiłeś tego często, to tak, prawdopodobnie mniej bezpieczne niż kopiowanie pojedynczego pliku. Może być bezpieczniejsze, jeśli plik jest duży, ponieważ rsync automatycznie obsługuje większość błędów, które mogą wystąpić podczas kopiowania. W pewnym kontekście moja składnia była dla mnie szczególnie przydatna, ponieważ napisałem kod, który generował polecenia w tej formie, więc biorąc pod uwagę wystarczające testy obejmujące odpowiedni kod, polecenia te są „bezpieczne”.
Kenny Evitt
0

Do tej pory dwie odpowiedzi nie są całkiem poprawne, otrzymają więcej niż jeden plik, a drugi nie jest tak prosty, jak mógłby być, oto prostsza odpowiedź IMO.

Poniższe polecenie pobiera dokładnie jeden plik, ale musisz utworzyć katalog dest za pomocą mkdir. To prawdopodobnie najszybsza opcja:

mkdir -p ./local/path/to/file
rsync user@remote:/remote/path/to/file/ -zarv --include "filename" --exclude "*" ./local/path/to/file/

Jeśli w katalogu / remote / path jest tylko jedno wystąpienie pliku, rsync może utworzyć katalogi, jeśli wykonasz następujące czynności. Prawdopodobnie zajmie to trochę więcej czasu, ponieważ przeszukuje więcej katalogów. Dodatkowo stworzy puste katalogi dla katalogów w / remote / path, których nie ma w ./local

cd ./local
rsync user@remote:/remote/path -zarv --include "*/" --include "filename" --exclude "*" .

Pamiętaj, że liczy się kolejność - uwzględnij i - wyklucz.

Samuel
źródło