一段时间以前,我需要了解rsync
我正在编写的脚本的输出。在编写该脚本的过程中,我四处搜寻并得出@mit 上面编写的内容。我使用该信息以及其他来源的文档来创建我自己的位标记入门,以及如何rsync
为所有操作输出位标记(默认情况下不执行此操作)。
我将这些信息发布在这里,希望它可以帮助其他人(例如我)通过搜索在此页面上迷失方向,并且需要更好的解释 rsync
。
随着组合--itemize-changes
标志和的-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),以获得对捕获的输出进行后期处理以隔离新文件,重复文件(相同名称,相同内容),文件冲突(相同名称,不同)的示例。内容),以及子目录结构的更改。