【问题标题】:What does f+++++++++ mean in rsync logs?rsync 日志中的 f+++++++++ 是什么意思?
【发布时间】:2011-05-28 11:16:25
【问题描述】:

我正在使用rsync 来备份我的服务器文件,我有两个问题:

  1. 在此过程中,我需要停止并再次启动rsync
    rsync 会从它停止的地方开始还是从头开始?

  2. 在日志文件中我看到"f+++++++++"。这是什么意思?

例如:

2010/12/21 08:28:37 [4537] >f.st...... iddd/logs/website-production-access_log
2010/12/21 08:29:11 [4537] >f.st...... iddd/web/website/production/shared/log/production.log
2010/12/21 08:29:14 [4537] .d..t...... iddd/web/website/production/shared/sessions/
2010/12/21 08:29:14 [4537] >f+++++++++ iddd/web/website/production/shared/sessions/ruby_sess.017a771cc19b18cd
2010/12/21 08:29:14 [4537] >f+++++++++ iddd/web/website/production/shared/sessions/ruby_sess.01eade9d317ca79a

【问题讨论】:

    标签: backup logging rsync


    【解决方案1】:

    让我们看看 rsync 是如何工作的,并更好地理解神秘的结果行:

    1 - rsync 的一个巨大优势是,在中断后下一次它会顺利继续。

    如果在此期间没有更改文件,则下一次 rsync 调用将不会再次传输已传输的文件。但它会从头开始重新检查所有文件以查找,因为它不知道它已被中断。

    2 - 如果您阅读man rsync 中的-i, --itemize-changes 部分,每个字符都是一个可以翻译的代码

    从问题中解码您的示例日志文件:

    >f.st......

    > - the item is received
    f - it is a regular file
    s - the file size is different
    t - the time stamp is different
    

    .d..t......

    . - the item is not being updated (though it might have attributes 
        that are being modified)
    d - it is a directory
    t - the time stamp is different
    

    >f+++++++++++

    > - the item is received
    f - a regular file
    +++++++++ - this is a newly created item
    

    rsync 手册页的相关部分:

    -i, --itemize-changes

    请求对每个文件进行的更改的简单逐项列表,包括属性更改。这与指定 --out-format='%i %n%L' 完全相同。如果您重复该选项,也将输出未更改的文件,但前提是接收的 rsync 至少为 2.6.7 版本(您可以将 -vv 与旧版本的 rsync 一起使用,但这也会打开其他详细消息的输出 - 圣人)。

    “%i”转义有一个神秘的输出,长度为 11 个字母。一般格式类似于字符串 YXcstpoguax,其中 Y 替换为正在执行的更新类型,X 替换为文件类型,其他字母表示在修改时可能输出的属性。

    替换Y的更新类型如下:

    • < 表示文件正在传输到远程主机(已发送)。
    • > 表示正在将文件传输到本地主机(已接收)。
    • c 表示该项目正在发生本地更改/创建(例如创建目录或更改符号链接等)。
    • h 表示该项目是另一个项目的硬链接(需要 --hard-links)。
    • . 表示项目未更新(尽管它可能具有正在修改的属性)。
    • * 表示逐项输出区域的其余部分包含一条消息(例如“删除”)。

    替换 X 的文件类型是:f 用于文件,d 用于目录,L 用于符号链接,D 用于设备,S 用于一个特殊的文件(例如命名的套接字和fifos)。

    上面字符串中的其他字母是在更新项目的关联属性时将输出的实际字母或“。”没有改变。三个例外是:(1)新创建的项目用“+”替换每个字母,(2)相同的项目用空格替换点,以及(3)未知属性用“?”替换每个字母(与旧的 rsync 通话时可能会发生这种情况)。

    每个字母对应的属性如下:

    • c 表示常规文件具有不同的校验和(需要 --checksum),或者符号链接、设备或特殊文件的值已更改。请注意,如果您将文件发送到 3.0.1 之前的 rsync,则此更改标志仅适用于校验和不同的常规文件。
    • s 表示常规文件的大小不同,将通过文件传输进行更新。
    • t 表示修改时间不同,正在更新为发送者的值(需要 --times)。 T 的另一个值意味着修改时间将设置为传输时间,这发生在没有 --times 的情况下更新文件/符号链接/设备以及更改符号链接并且接收者无法设置其时间时。 (注意:在使用 rsync 3.0.0 客户端时,您可能会看到 s 标志与 t 组合,而不是正确的 T 标志,以导致此时间设置失败。)
    • p 表示权限不同,并且正在更新为发件人的值(需要 --perms)。
    • o 表示所有者不同,并且正在更新为发件人的值(需要 --owner 和超级用户权限)。
    • g 表示组不同,正在更新为发件人的值(需要 --group 和设置组的权限)。
    • u 插槽保留供将来使用。
    • a 表示 ACL 信息已更改。
    • x表示扩展属性信息发生变化。

    另一个输出是可能的:删除文件时,“%i”将为每个要删除的项目输出字符串“*deleting”(假设您正在与最近的 rsync 对话,它记录删除而不是将它们作为详细消息输出)。

    【讨论】:

    • 这个帖子/答案现在已经很老了,但我不得不写一个评论。是我见过的关于 rsync 的最佳答案之一。谢谢mit
    【解决方案2】:

    前段时间,我需要了解我正在编写的脚本的rsync 输出。在编写该脚本的过程中,我四处搜索并找到了@mit 写的above。我使用这些信息以及其他来源的文档来创建我自己的位标志入门以及如何让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|\*).......... .')
    

    在上面的示例中,rsync 的 (stdout) 输出被重定向到 grep(通过标准输入),因此我们可以仅隔离包含位标志的行。

    处理捕获的输出:

    然后可以记录变量的内容以供以后使用或立即迭代感兴趣的项目。我在研究更多关于rsync 时编写的脚本中使用了这个确切的策略。您可以查看脚本 (https://github.com/jmmitchell/movestough) 以获取对捕获的输出进行后处理以隔离新文件、重复文件(相同名称、相同内容)、文件冲突(相同名称、不同内容)以及更改的示例在子目录结构中。

    【讨论】:

    • 非常有用!日志输出中的 -T 是什么?
    • Pol,你问的是 rsync 的 -T 标志吗?
    • Pol,如果我正确理解您的问题,rsync 日志中的 t 表示比较的两个文件具有不同的时间戳。这意味着它们是在不同时间创建或修改的。
    • 我相信输出中的“T”表示时间已更新为当前时间,“
    • 我晚了几年,但是手册页中解释了“t”与“T”:A t 表示修改时间不同并且正在更新为发送者的值(需要——次)。 T 的另一个值意味着修改时间将设置为传输时间,这发生在没有 --times 的情况下更新文件/符号链接/设备以及更改符号链接并且接收器无法设置其时间时。 (注意:当使用 rsync 3.0.0 客户端时,您可能会看到 s 标志与 t 组合,而不是正确的 T 标志,因为此时间设置失败。)
    【解决方案3】:

    1.) 它将“重新启动同步”,但不会传输相同大小和时间戳等的文件。它首先建立一个要传输的文件列表,在此阶段它会看到它已经传输了一些文件并将跳过它们。您应该告诉 rsync 保留时间戳等(例如使用rsync -a ...

    当 rsync 正在传输文件时,它会将其命名为 .filename.XYZABC 而不是 filename。然后,当它完成传输该文件时,它将重命名它。因此,如果您在传输大文件时终止 rsync,您将不得不使用 --partial 选项来继续传输,而不是从头开始。

    2.) 我不知道那是什么。可以贴一些例子吗?

    编辑:根据http://ubuntuforums.org/showthread.php?t=1342171,这些代码在-i, --itemize-changes 选项部分的rsync 手册页中定义。

    如果我的回答是基于 Joao 的,则修复部分

    【讨论】:

    • 我在上面放了一些日志示例。谢谢。
    • 我已经更新了我的答案。代码在手册页中进行了解释。
    最近更新 更多