Bir süre önce, yazdığım rsync
bir senaryonun çıktısını anlamam gerekiyordu . O senaryoyu yazma sürecinde Google'da dolaştım ve @mit'in yukarıda yazdığı şeye geldim . Bu bilgileri ve diğer kaynaklardan gelen belgeleri, bit bayrakları üzerinde kendi primerimi oluşturmak ve rsync
tüm eylemler için bit bayraklarının nasıl çıktılacağını öğrenmek için kullandım (bunu varsayılan olarak yapmaz).
Bu bilgiyi burada, (benim gibi) arama yoluyla bu sayfaya rastlayan ve daha iyi bir açıklamaya ihtiyaç duyan diğerlerine yardımcı olması umuduyla yayınlıyorum rsync
.
Kombinasyonu ile --itemize-changes
bayrak ve-vvv
bayrak, rsync
bize hedef dizine karşılaştırıldığında kaynak dizininde tespit edildiği tüm dosya sistemi değişiklikleri ayrıntılı çıkış verir. Tarafından üretilen bit bayrakları rsync
, neyin değiştiğini belirlemek için daha sonra çözülebilir. Her bitin anlamını çözmek için aşağıdaki tabloyu kullanın.
Her bit konumunun ve rsync
çıkışındaki değerin açıklaması :
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")
Çeşitli senaryolar için rsync'den bazı örnek çıktılar:
>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/
rsync
Çıktının yakalanması (bit bayraklarına odaklanmış):
Benim deneyler, her iki --itemize-changes
bayrak ve-vvv
bayrak almak için gerekli olan rsync
çıkış için bir giriş , tüm dosya sistemi değişiklikleri. Üçlü verbose ( -vvv
) bayrağı olmadan, listelenen dizin, bağlantı ve aygıt değişikliklerini görmüyordum. Beklediğiniz her şeyi gözlemlediğinden ve not ettiğinden emin olmak için rsync sürümünüzü denemeye değer.
Bu tekniğin kullanışlı bir kullanımı --dry-run
, komuta bayrağı eklemek ve rsync tarafından belirlenen değişiklik listesini bir değişkene toplamaktır (herhangi bir değişiklik yapmadan), böylece listede bazı işlemleri kendiniz yapabilirsiniz. Aşağıdakine benzer bir şey, çıktıyı bir değişkende yakalar:
file_system_changes=$(rsync --archive --acls --xattrs \
--checksum --dry-run \
--itemize-changes -vvv \
"/some/source-path/" \
"/some/destination-path/" \
| grep -E '^(\.|>|<|c|h|\*).......... .')
Yukarıdaki örnekte, rsync
öğesinin (stdout) çıkışı grep
(stdin aracılığıyla) öğesine yeniden yönlendirilir, böylece yalnızca bit bayrakları içeren satırları izole edebiliriz.
Yakalanan çıktının işlenmesi:
Değişkenin içeriği daha sonra daha sonra kullanılmak üzere kaydedilebilir veya ilgilenilen öğeler için hemen yinelenebilir. Hakkında daha fazla araştırma yaparken yazdığım senaryoda tam olarak bu taktiği kullanıyorum rsync
. Sen komut (bakabilirsiniz https://github.com/jmmitchell/movestough örnekleri için) yeni dosyalar, çift dosyaları (aynı isim, aynı içeriği), dosya çarpışmalar (aynı adı izole etmek yakalanan çıkışı sonrası işleme, farklı içerik) ve alt dizin yapılarındaki değişiklikler.