在 rsync 日志中 f + + + + + + + 是什么意思?

我正在使用 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
97353 次浏览

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

当 rsync 传输一个文件时,它会将其命名为类似于 .filename.XYZABC的东西,而不是 filename。然后,当它完成传输该文件时,它将重命名该文件。因此,如果在 rsync 传输大型文件时终止它,则必须使用—— part 选项来继续传输,而不是从头开始。

我不知道那是什么。你能粘贴一些例子吗?

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

固定部分,如果我的答案基于若昂的

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

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

下一次 rsync 调用将不会再次传输已经传输的文件,如果在此期间没有更改这些文件的话。但是它会从一开始就开始检查所有的文件来找出答案,因为它不知道它已经被中断了。

每个字符都是一个代码,如果你阅读 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 手册页的相关部分:

- 我——逐条列出——变化

请求正在进行的更改的简单逐项列表 每个文件,包括属性更改 指定—— out-format =’% i% n% L’ 文件也将被输出,但只有当接收的 rsync 至少是 版本2.6.7(您可以在旧版本的 rsync 中使用-vv,但是 也会打开其他冗长消息的输出)。

“% i”转义有一个11个字母长的神秘输出 通用格式类似于字符串 YXcstpoguax,其中 Y 被 正在执行的更新类型,X 被替换为文件类型,并且 其他字母表示可以输出的属性,如果它们是 正在被修改。

替换 Y 的更新类型如下:

  • <表示正在将文件传输到远程主机(发送)。
  • >表示正在将文件传输到本地主机(接收)。
  • c表示正在对该项进行本地更改/创建(例如创建目录或更改符号链接, 等)。
  • h意味着该项是到另一项的硬链接(需要——硬链接)。
  • .意味着项目没有被更新(尽管它可能有正在修改的属性)。
  • *表示其余的逐项输出区域包含一条消息(例如“删除”)。

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

上面字符串中的其他字母是将 如果项的关联属性正在更新,或者 对于没有改变。三个例外是: (1)一个新创建的 用“ +”代替每个字母,(2)用相同的项目代替 点与空格,(3)一个未知的属性替换每个 带“ ?”的字母(与较旧的 rsync 通信时可能会出现这种情况)。

与每个字母关联的属性如下:

  • c意味着常规文件具有不同的校验和(需要——校验和) ,或者符号链接、设备或特殊文件具有 请注意,如果在以前将文件发送到 rsync,则 3.0.1,这个更改标志将只出现在校验和不同的常规文件中。
  • s表示常规文件的大小不同,将通过文件传输进行更新。
  • t表示修改时间不同,正在更新到发送方的值(需要—— times)。T 的替代值 意味着修改时间将被设置为传输时间, 当文件/symlink/设备在没有—— times 的情况下更新时会发生这种情况 当一个符号链接发生变化时,接收器无法设置它的时间。 (注意: 在使用 rsync 3.0.0客户端时,您可能会看到 s 标志 结合 t 而不是正确的 T 标志为这个时间设置 失败)
  • p表示权限不同,正在更新为发件人的值(需要—— perms)。
  • o意味着所有者是不同的,并且正在更新到发送者的值(需要—— owner 和 super-user 特权)。
  • g意味着组是不同的,并且正在更新到发送方的值(需要—— group 和设置组的权限)。
  • u插槽是为将来使用而保留的。
  • a意味着 ACL 信息发生了更改。
  • x意味着扩展属性信息发生了更改。

另一种输出是可能的: 当删除文件时,“% i”将 输出要删除的每个项的字符串“ * delete” (假设您正在与一个足够近的 rsync 通话,以便它记录日志 删除,而不是将它们作为冗长的消息输出)。

一段时间以前,我需要理解我正在编写的脚本的 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|\*).......... .')

在上面的示例中,来自 rsync的(stdout)输出被重定向到 grep(通过 stdin) ,因此我们只能隔离包含位标志的行。

处理捕获的输出:

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