Некоторое время назад мне нужно было понять вывод rsync
для сценария, который я писал.В процессе написания этого скрипта я гуглил и пришел к тому, что @mit написал выше .Я использовал эту информацию, а также документацию из других источников, чтобы создать свой собственный учебник по битовым флагам и как заставить rsync
выводить битовые флаги для всех действий (по умолчанию это не выполняется).
Я публикую эту информацию здесь в надежде, что она поможет другим, кто (как и я), наткнуться на эту страницу с помощью поиска и нуждается в более подробном объяснении rsync
.
С комбинацией --itemize-changes
flag и флаг -vvv
, rsync
дает нам подробный вывод всех изменений файловой системы, которые были идентифицированы в исходном каталоге по сравнению с целевым каталогом.Битовые флаги, создаваемые rsync
, затем могут быть декодированы, чтобы определить, что изменилось.Чтобы декодировать значение каждого бита, используйте следующую таблицу.
Объяснение каждой позиции бита и значения на выходе rsync
:
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")
Пример вывода из rsync для различных сценариев:
>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
(сфокусирован на битовых флагах):
В моемэкспериментируя, и --itemize-changes
флаг и флаг -vvv
необходимы для получения rsync
для вывода записи для всех изменений файловой системы.Без трехкратного подробного (-vvv
) флага я не видел в списке изменений каталога, ссылки и устройства.Стоит поэкспериментировать с вашей версией rsync, чтобы убедиться, что она наблюдает и отмечает все, что вы ожидали.
Одним из удобных способов использования этого метода является добавление флага --dry-run
в команду и сбор изменений.список, как определено rsync, в переменную (без внесения каких-либо изменений), так что вы можете выполнить некоторую обработку списка самостоятельно.Что-то вроде следующего будет захватывать выходные данные в переменной:
file_system_changes=$(rsync --archive --acls --xattrs \
--checksum --dry-run \
--itemize-changes -vvv \
"/some/source-path/" \
"/some/destination-path/" \
| grep -E '^(\.|>|<|c|h|\*).......... .')
В приведенном выше примере вывод (stdout) из rsync
перенаправляется в grep
(через stdin), поэтому мы можем изолировать толькостроки, которые содержат битовые флаги.
Обработка захваченного вывода:
Содержимое переменной может быть зарегистрировано для последующего использования или немедленно перебрано для интересующих элементов,Я использую эту точную тактику в сценарии, который я написал во время исследования о rsync
.Вы можете посмотреть на сценарий (https://github.com/jmmitchell/movestough) для примеров последующей обработки захваченного вывода для изоляции новых файлов, дубликатов файлов (с одинаковым именем, одинаковым содержимым), столкновений файлов (с тем же именем, различным содержимым), а также сизменения в подкаталогах.