Qualche tempo fa, avevo bisogno di capire l' rsync
output di uno script che stavo scrivendo. Durante il processo di scrittura di quella sceneggiatura ho cercato su Google e sono arrivato a ciò che @mit aveva scritto sopra . Ho usato queste informazioni, così come la documentazione da altre fonti, per creare il mio primer sui flag di bit e su come ottenere rsync
i flag di bit per tutte le azioni (non lo fa per impostazione predefinita).
Sto postando queste informazioni qui nella speranza che aiutino altri che (come me) si imbattono in questa pagina tramite la ricerca e hanno bisogno di una migliore spiegazione rsync
.
Con la combinazione del --itemize-changes
flag e del -vvv
flag, rsync
ci fornisce un output dettagliato di tutte le modifiche al file system che sono state identificate nella directory di origine rispetto alla directory di destinazione. I flag di bit prodotti da rsync
possono quindi essere decodificati per determinare cosa è cambiato. Per decodificare il significato di ogni bit, utilizzare la tabella seguente.
Spiegazione della posizione e del valore di ogni bit rsync
nell'uscita di:
YXcstpoguax path/to/file
|||||||||||
||||||||||╰- x: The extended attribute information changed
|||||||||╰-- a: The ACL information changed
||||||||╰--- u: The u slot is reserved for future use
|||||||╰---- g: Group is different
||||||╰----- o: Owner is different
|||||╰------ p: Permission are different
||||╰------- t: Modification time is different
|||╰-------- s: Size is different
||╰--------- c: Different checksum (for regular files), or
|| changed value (for symlinks, devices, and special files)
|╰---------- the file type:
| f: for a file,
| d: for a directory,
| L: for a symlink,
| D: for a device,
| S: for a special file (e.g. named sockets and fifos)
╰----------- the type of update being done::
<: file is being transferred to the remote host (sent)
>: file is being transferred to the local host (received)
c: local change/creation for the item, such as:
- the creation of a directory
- the changing of a symlink,
- etc.
h: the item is a hard link to another item (requires
--hard-links).
.: the item is not being updated (though it might have
attributes that are being modified)
*: means that the rest of the itemized-output area contains
a message (e.g. "deleting")
Alcuni esempi di output da rsync per vari scenari:
>f+++++++++ some/dir/new-file.txt
.f....og..x some/dir/existing-file-with-changed-owner-and-group.txt
.f........x some/dir/existing-file-with-changed-unnamed-attribute.txt
>f...p....x some/dir/existing-file-with-changed-permissions.txt
>f..t..g..x some/dir/existing-file-with-changed-time-and-group.txt
>f.s......x some/dir/existing-file-with-changed-size.txt
>f.st.....x some/dir/existing-file-with-changed-size-and-time-stamp.txt
cd+++++++++ some/dir/new-directory/
.d....og... some/dir/existing-directory-with-changed-owner-and-group/
.d..t...... some/dir/existing-directory-with-different-time-stamp/
Cattura rsync
dell'output di (focalizzato sui flag di bit):
Nella mia sperimentazione, sia il --itemize-changes
flag che il -vvv
flag sono necessari per ottenere rsync
una voce per tutte le modifiche al file system. Senza il -vvv
flag triple verbose ( ), non vedevo le modifiche alla directory, al collegamento e al dispositivo elencate. Vale la pena sperimentare con la propria versione di rsync per assicurarsi che stia osservando e annotando tutto ciò che ci si aspettava.
Un uso pratico di questa tecnica è aggiungere il --dry-run
flag al comando e raccogliere l'elenco delle modifiche, come determinato da rsync, in una variabile (senza apportare modifiche) in modo da poter eseguire autonomamente alcune elaborazioni nell'elenco. Qualcosa di simile al seguente catturerebbe l'output in una variabile:
file_system_changes=$(rsync --archive --acls --xattrs \
--checksum --dry-run \
--itemize-changes -vvv \
"/some/source-path/" \
"/some/destination-path/" \
| grep -E '^(\.|>|<|c|h|\*).......... .')
Nell'esempio sopra, l'output (stdout) da rsync
viene reindirizzato a grep
(tramite stdin), quindi possiamo isolare solo le righe che contengono flag di bit.
Elaborazione dell'output acquisito:
Il contenuto della variabile può quindi essere registrato per un uso successivo o immediatamente ripetuto per elementi di interesse. Uso questa tattica esatta nella sceneggiatura che ho scritto durante la ricerca di più rsync
. Puoi guardare lo script ( https://github.com/jmmitchell/movestough ) per esempi di post-elaborazione dell'output catturato per isolare nuovi file, file duplicati (stesso nome, stesso contenuto), collisioni di file (stesso nome, diverso content), così come i cambiamenti nelle strutture delle sottodirectory.