Uzyskaj listę przesłanych plików z rsync?

15

Obecnie używam rsyncw skrypcie, który wdraża aplikację PHP ze środowiska testowego na serwer produkcyjny. Oto jak:

rsync -rzai --progress --stats --ignore-times --checksum /tmp/app_export/ root@app.com:/var/www/html/app/

To powoduje obecnie wyświetlenie listy każdego porównywanego pliku (każdego pliku w projekcie), ale chciałbym, aby wyświetlał tylko te zmodyfikowane, więc mogę uruchomić go z --dry-runopcją sprawdzenia, czy każde wdrożenie aktualizuje tylko pożądane pliki.

UWAGA: Do tej pory najlepsze, co mogłem zrobić, to grep fcstwyniki, ale szukam rsyncopcji, która na pewno tam jest, ale nie mogę jej znaleźć na stronach podręcznika.

Z góry dziękuję!

Mauro
źródło

Odpowiedzi:

6

Jeśli istnieje opcja rsync umożliwiająca wykonanie dokładnie tego, o co prosisz, nie znalazłem jej również na stronie podręcznika. :-)

To powiedziawszy, nie widzę problemu z dopracowaniem wyjścia rsync -ido parsowania dokładnie tego, czego potrzebujesz. To jest dla mnie przyjemne i unikalne.

Jeden wybredny spór za pomocą polecenia rsync: -rjest redundantny, jak sugeruje -a.

Kevin DeGraaf
źródło
2
Dzięki. Zastanawiam się, dlaczego (z różnorodnymi opcjami tego programu) nie ma na to opcji. Wydaje mi się to dość proste.
Mauro
Cześć Kevin, w rzeczywistości istnieje opcja: -Ppostęp robi dokładnie to w -nustawieniu dryrun, chociaż też -inie jest źle. Zobacz moją odpowiedź poniżej.
Robert Riedl
7

Użyj --out-formatopcji

Według strony podręcznika:

Określenie --out-formatopcji spowoduje wymienienie każdego pliku, katalogu itp., Który zostanie znacząco zaktualizowany (przesłany plik, odtworzone dowiązanie symboliczne / urządzenie lub katalog).

Jeśli potrzebujesz tylko rzeczywistych nazw plików ( --out-format="%n"), polecenie suchego uruchamiania może wyglądać następująco:

rsync -rzan --out-format="%n" --ignore-times --checksum /tmp/app_export/ [email protected]:/var/www/html/app/


Kiedy rsync jest wywoływany za pomocą -v, wewnętrznie korzysta z tej opcji w domyślnym formacie "%n%L", który podaje tylko nazwę pliku, a jeśli element jest linkiem, to wskazuje.

Ale obejmuje to również krótkie podsumowanie na początku i na końcu procesu synchronizacji.

Aby pozbyć się tego podsumowania, użyj --out-formatopcji bezpośrednio.

Btw. -irównież używa wewnętrznie --out-format, ale w formacie "%i %n%L".

grypa
źródło
4

Począwszy od rsync v3.1.0, wydanego w 2013 r., Dostępna jest --infoflaga, która umożliwia precyzyjną kontrolę nad danymi wyjściowymi.

 --info=FLAGS
          This option lets you have fine-grained control over the information output you want to see.  An individual flag name may be followed
          by a level number, with 0 meaning to silence that output, 1 being the default output level, and higher numbers increasing the output
          of that flag (for those that support higher levels).  Use --info=help to see all the available flag names,  what  they  output,  and
          what flag names are added for each increase in the verbose level.  Some examples:

              rsync -a --info=progress2 src/ dest/
              rsync -avv --info=stats2,misc1,flist0 src/ dest/

          Note  that  --info=names  output  is  affected  by the --out-format and --itemize-changes (-i) options.  See those options for more
          information on what is output and when.

          This option was added to 3.1.0, so an older rsync on the server side might reject your attempts at fine-grained control (if  one  or
          more  flags  needed  to  be  send to the server and the server was too old to understand them).  See also the "max verbosity" caveat
          above when dealing with a daemon.

Dostępne --infoflagi to:

Use OPT or OPT1 for level 1 output, OPT2 for level 2, etc.; OPT0 silences.

BACKUP     Mention files backed up
COPY       Mention files copied locally on the receiving side
DEL        Mention deletions on the receiving side
FLIST      Mention file-list receiving/sending (levels 1-2)
MISC       Mention miscellaneous information (levels 1-2)
MOUNT      Mention mounts that were found or skipped
NAME       Mention 1) updated file/dir names, 2) unchanged names
PROGRESS   Mention 1) per-file progress or 2) total transfer progress
REMOVE     Mention files removed on the sending side
SKIP       Mention files that are skipped due to options used
STATS      Mention statistics at end of run (levels 1-3)
SYMSAFE    Mention symlinks that are unsafe

ALL        Set all --info options (e.g. all4)
NONE       Silence all --info options (same as all0)
HELP       Output this help message

Options added for each increase in verbose level:
1) COPY,DEL,FLIST,MISC,NAME,STATS,SYMSAFE
2) BACKUP,MISC2,MOUNT,NAME2,REMOVE,SKIP
Corneliu
źródło
1
To jest niesamowite, dzięki. Nie miałem pojęcia, że ​​ta flaga istnieje, ponieważ używam komputera Mac - nawet najnowszy MacOS instaluje wersję rsync z lol 2004. Na zdrowie Apple ...
twistedpixel
0

Nie jestem pewien, czy różni się to między używanymi wersjami / opcjami, ale w wersji mys, kiedy używam -iopcji, otrzymuję listę:

>f..T...... existing-file.png
>f+++++++++ new-file.png
cd+++++++++ new-dir/
>f+++++++++ new-dir/new-file.png

Więc proste rozwiązanie, aby uzyskać tylko listę plików faktycznie przesłanych, wystarczy uruchomić:

rsync [your options here] | grep -v "f..T......"

To po prostu ukryje wszystkie linie zawierające f..T....... Tak skutecznie ukryje to identyczne pliki.

Nux
źródło
0

W rzeczywistości odpowiedziałeś na własne pytanie, ponieważ twoje pierwotne polecenie już je ma: --progress

Jest to poprawna opcja, chociaż strona podręcznika jest nieco tajemnicza:

     --progress              show progress during transfer
 -P                          same as --partial --progress

To ma sens, ponieważ wywołujesz swój rsyncciąg znaków w trybie dryrun, nie dzieje się nic innego, ale nadal masz postęp: mianowicie pliki, które się zmieniły i zostałyby przeniesione.

W ten sposób otrzymujesz schludną małą listę wszystkich plików, na przykład:

Miejsce docelowe ma już kopię pliku zmienionego, który został zaktualizowany w źródłowym i starym pliku, który pozostaje niezmieniony. Źródło ma również dodatkowy plik: newfile.

#~$ ls -lhan /tmp/destination/
total 20K
drwxrwxr-x  2 1000 1000 4,0K Jän 31 09:07 .
drwxrwxrwt 18    0    0  12K Jän 31 09:15 ..
-rw-rw-r--  1 1000 1000    2 Jän 31 09:08 changedfile
-rw-rw-r--  1 1000 1000    0 Jän 31 09:07 oldfile



#~$ ls -lhan /tmp/source/
total 20K
drwxrwxr-x  2 1000 1000 4,0K Jän 31 09:07 .
drwxrwxrwt 18    0    0  12K Jän 31 09:15 ..
-rw-rw-r--  1 1000 1000    2 Jän 31 09:15 changedfile
-rw-rw-r--  1 1000 1000    0 Jän 31 09:07 newfile
-rw-rw-r--  1 1000 1000    0 Jän 31 09:07 oldfile

Jeśli następnie wywołamy twoją komendę rsync, ale usuń -iwyszczególnienie i po prostu dodaj dryrun-n

#~$ ~$ rsync -n -rza --progress --stats --ignore-times --checksum /tmp/source/ /tmp/destination/
sending incremental file list
changedfile
newfile

Number of files: 4 (reg: 3, dir: 1)
Number of created files: 1 (reg: 1)
Number of deleted files: 0
Number of regular files transferred: 2
Total file size: 2 bytes
Total transferred file size: 2 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 187
Total bytes received: 22

sent 187 bytes  received 22 bytes  418.00 bytes/sec
total size is 2  speedup is 0.01 (DRY RUN)

Otrzymasz listę tylko plików, które rsync przetransferowałby: zmieniono plik i nowy plik.

Robert Riedl
źródło