文件传输同步工具----rsync

2023-05-18 14:55:41 浏览数 (2)

简介

rsync是一种强大的命令行工具,用于在本地或远程计算机之间进行文件同步。它可以将文件从一个位置复制到另一个位置,同时节约带宽和存储空间。

这个命令在之前就已经已经接触过,同类型工具还有scp

这两个工具通常用来远程传输文件,但实际上用传输文件来形容并不恰当。应该是复制文件,是将本地文件复制到远程主机,或者将远程主机文件复制到本地。同时,也可以在同一主机上复制文件,类似于cp命令。

rsync与scp差异

  1. 传输效率:rsync 可以复制已经存在于目标主机上的文件,同时只传输修改的部分。这可以显著提高传输速度,特别是在传输大文件或大型文件夹时。而 scp 则需要将整个文件/文件夹再次复制到目标主机。
  2. 远程传输:scp 只能在本地主机和远程主机之间传输文件,而 rsync 可以复制从一个远程主机到另一个(或者与本地主机组合)。
  3. 数据保护:由于 rsync 在传输数据时进行了一些冗错检查,因此更可靠。如果您的文件损坏了,传输过程中的 rsync 操作将确保自动重新上传,并验证已完成的数据。scp 在传输过程中没有提供相同的保护。
  4. 使用方式:rsync 当前托管在大多数操作系统存储库中,是默认预先安装的。另外,rsync 的使用方式也比 scp 更为灵活,可以设定选项来指定传输需求,并在传输结束后提供详细报告。而 scp 是基于ssh协议的安全拷贝,需要保证两端都正确安装且配置ssh,并且运行时只能接受有限的命令行选项。

详解rsync

使用rsync -h查看使用文档:

代码语言:javascript复制
┌──(root㉿kali)-[~]
└─# rsync -h
rsync  version 3.2.4  protocol version 31
Copyright (C) 1996-2022 by Andrew Tridgell, Wayne Davison, and others.
Web site: https://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, symlinks, symtimes, hardlinks, hardlink-specials,
    hardlink-symlinks, IPv6, atimes, batchfiles, inplace, append, ACLs,
    xattrs, optional protect-args, iconv, prealloc, stop-at, no crtimes
Optimizations:
    SIMD-roll, no asm-roll, openssl-crypto, no asm-MD5
Checksum list:
    xxh128 xxh3 xxh64 (xxhash) md5 md4 none
Compress list:
    zstd lz4 zlibx zlib none

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.

rsync is a file transfer program capable of efficient remote update
via a fast differencing algorithm.

Usage: rsync [OPTION]... SRC [SRC]... DEST
  or   rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
  or   rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
  or   rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST
  or   rsync [OPTION]... [USER@]HOST:SRC [DEST]
  or   rsync [OPTION]... [USER@]HOST::SRC [DEST]
  or   rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
The ':' usages connect via remote shell, while '::' & 'rsync://' usages connect
to an rsync daemon, and require SRC or DEST to start with a module name.

Options
--verbose, -v            increase verbosity
--info=FLAGS             fine-grained informational verbosity
--debug=FLAGS            fine-grained debug verbosity
--stderr=e|a|c           change stderr output mode (default: errors)
--quiet, -q              suppress non-error messages
--no-motd                suppress daemon-mode MOTD
--checksum, -c           skip based on checksum, not mod-time & size
--archive, -a            archive mode is -rlptgoD (no -A,-X,-U,-N,-H)
--no-OPTION              turn off an implied OPTION (e.g. --no-D)
--recursive, -r          recurse into directories
--relative, -R           use relative path names
--no-implied-dirs        don't send implied dirs with --relative
--backup, -b             make backups (see --suffix & --backup-dir)
--backup-dir=DIR         make backups into hierarchy based in DIR
--suffix=SUFFIX          backup suffix (default ~ w/o --backup-dir)
--update, -u             skip files that are newer on the receiver
--inplace                update destination files in-place
--append                 append data onto shorter files
--append-verify          --append w/old data in file checksum
--dirs, -d               transfer directories without recursing
--old-dirs, --old-d      works like --dirs when talking to old rsync
--mkpath                 create the destination's path component
--links, -l              copy symlinks as symlinks
--copy-links, -L         transform symlink into referent file/dir
--copy-unsafe-links      only "unsafe" symlinks are transformed
--safe-links             ignore symlinks that point outside the tree
--munge-links            munge symlinks to make them safe & unusable
--copy-dirlinks, -k      transform symlink to dir into referent dir
--keep-dirlinks, -K      treat symlinked dir on receiver as dir
--hard-links, -H         preserve hard links
--perms, -p              preserve permissions
--executability, -E      preserve executability
--chmod=CHMOD            affect file and/or directory permissions
--acls, -A               preserve ACLs (implies --perms)
--xattrs, -X             preserve extended attributes
--owner, -o              preserve owner (super-user only)
--group, -g              preserve group
--devices                preserve device files (super-user only)
--copy-devices           copy device contents as a regular file
--write-devices          write to devices as files (implies --inplace)
--specials               preserve special files
-D                       same as --devices --specials
--times, -t              preserve modification times
--atimes, -U             preserve access (use) times
--open-noatime           avoid changing the atime on opened files
--crtimes, -N            preserve create times (newness)
--omit-dir-times, -O     omit directories from --times
--omit-link-times, -J    omit symlinks from --times
--super                  receiver attempts super-user activities
--fake-super             store/recover privileged attrs using xattrs
--sparse, -S             turn sequences of nulls into sparse blocks
--preallocate            allocate dest files before writing them
--dry-run, -n            perform a trial run with no changes made
--whole-file, -W         copy files whole (w/o delta-xfer algorithm)
--checksum-choice=STR    choose the checksum algorithm (aka --cc)
--one-file-system, -x    don't cross filesystem boundaries
--block-size=SIZE, -B    force a fixed checksum block-size
--rsh=COMMAND, -e        specify the remote shell to use
--rsync-path=PROGRAM     specify the rsync to run on remote machine
--existing               skip creating new files on receiver
--ignore-existing        skip updating files that exist on receiver
--remove-source-files    sender removes synchronized files (non-dir)
--del                    an alias for --delete-during
--delete                 delete extraneous files from dest dirs
--delete-before          receiver deletes before xfer, not during
--delete-during          receiver deletes during the transfer
--delete-delay           find deletions during, delete after
--delete-after           receiver deletes after transfer, not during
--delete-excluded        also delete excluded files from dest dirs
--ignore-missing-args    ignore missing source args without error
--delete-missing-args    delete missing source args from destination
--ignore-errors          delete even if there are I/O errors
--force                  force deletion of dirs even if not empty
--max-delete=NUM         don't delete more than NUM files
--max-size=SIZE          don't transfer any file larger than SIZE
--min-size=SIZE          don't transfer any file smaller than SIZE
--max-alloc=SIZE         change a limit relating to memory alloc
--partial                keep partially transferred files
--partial-dir=DIR        put a partially transferred file into DIR
--delay-updates          put all updated files into place at end
--prune-empty-dirs, -m   prune empty directory chains from file-list
--numeric-ids            don't map uid/gid values by user/group name
--usermap=STRING         custom username mapping
--groupmap=STRING        custom groupname mapping
--chown=USER:GROUP       simple username/groupname mapping
--timeout=SECONDS        set I/O timeout in seconds
--contimeout=SECONDS     set daemon connection timeout in seconds
--ignore-times, -I       don't skip files that match size and time
--size-only              skip files that match in size
--modify-window=NUM, -@  set the accuracy for mod-time comparisons
--temp-dir=DIR, -T       create temporary files in directory DIR
--fuzzy, -y              find similar file for basis if no dest file
--compare-dest=DIR       also compare destination files relative to DIR
--copy-dest=DIR          ... and include copies of unchanged files
--link-dest=DIR          hardlink to files in DIR when unchanged
--compress, -z           compress file data during the transfer
--compress-choice=STR    choose the compression algorithm (aka --zc)
--compress-level=NUM     explicitly set compression level (aka --zl)
--skip-compress=LIST     skip compressing files with suffix in LIST
--cvs-exclude, -C        auto-ignore files in the same way CVS does
--filter=RULE, -f        add a file-filtering RULE
-F                       same as --filter='dir-merge /.rsync-filter'
                         repeated: --filter='- .rsync-filter'
--exclude=PATTERN        exclude files matching PATTERN
--exclude-from=FILE      read exclude patterns from FILE
--include=PATTERN        don't exclude files matching PATTERN
--include-from=FILE      read include patterns from FILE
--files-from=FILE        read list of source-file names from FILE
--from0, -0              all *-from/filter files are delimited by 0s
--old-args               disable the modern arg-protection idiom
--protect-args, -s       no space-splitting; wildcard chars only
--copy-as=USER[:GROUP]   specify user & optional group for the copy
--address=ADDRESS        bind address for outgoing socket to daemon
--port=PORT              specify double-colon alternate port number
--sockopts=OPTIONS       specify custom TCP options
--blocking-io            use blocking I/O for the remote shell
--outbuf=N|L|B           set out buffering to None, Line, or Block
--stats                  give some file-transfer stats
--8-bit-output, -8       leave high-bit chars unescaped in output
--human-readable, -h     output numbers in a human-readable format
--progress               show progress during transfer
-P                       same as --partial --progress
--itemize-changes, -i    output a change-summary for all updates
--remote-option=OPT, -M  send OPTION to the remote side only
--out-format=FORMAT      output updates using the specified FORMAT
--log-file=FILE          log what we're doing to the specified FILE
--log-file-format=FMT    log updates using the specified FMT
--password-file=FILE     read daemon-access password from FILE
--early-input=FILE       use FILE for daemon's early exec input
--list-only              list the files instead of copying them
--bwlimit=RATE           limit socket I/O bandwidth
--stop-after=MINS        Stop rsync after MINS minutes have elapsed
--stop-at=y-m-dTh:m      Stop rsync at the specified point in time
--fsync                  fsync every written file
--write-batch=FILE       write a batched update to FILE
--only-write-batch=FILE  like --write-batch but w/o updating dest
--read-batch=FILE        read a batched update from FILE
--protocol=NUM           force an older protocol version to be used
--iconv=CONVERT_SPEC     request charset conversion of filenames
--checksum-seed=NUM      set block/file checksum seed (advanced)
--ipv4, -4               prefer IPv4
--ipv6, -6               prefer IPv6
--version, -V            print the version   other info and exit
--help, -h (*)           show this help (* -h is help only on its own)

Use "rsync --daemon --help" to see the daemon-mode command-line options.
Please see the rsync(1) and rsyncd.conf(5) manpages for full documentation.
See https://rsync.samba.org/ for updates, bug reports, and answers

Bash

常用参数

-a

表示以递归方式传输文件,并保持所有文件属性不变

-v

详细输出,显示正在进行的操作和每个文件的传输进度

-r

递归复制目录及其中的文件

-u

仅更新目标文件,不覆盖已存在且新于源文件的文件

-z

传输时压缩数据,减少网络带宽占用

-n

查看 rsync 将执行哪些操作的预演模式,但不真正运行传输这样您可以在实际移动文件前测试 rsync 命令是否按照预期工作

--delete

删除目标上没有源文件对应的文件

--exclude=PATTERN

排除匹配上指定的文件或目录

--include=PATTERN

包含匹配上指定的文件或目录

--bwlimit=LIMIT

同时只使用指定的带宽限制 (单位为 Kbps)

--progress

显示传输时的实时进度

实例

基本复制 将本地目录/home/user/example同步到远程主机的目录/home/remoteuser/example,命令如下:

代码语言:javascript复制
rsync -avz /home/user/example remoteuser@remotehost:/home/remoteuser/example

Bash

此命令的含义是以归档模式(archive mode)同步目录,-v选项启用详细输出,-z选项启用压缩传输方式。

远程同步 如果想要从本地计算机向远程计算机同步,需要在目标路径前添加远程主机用户名和主机名,如下所示:

代码语言:javascript复制
rsync -avz /home/user/example remoteuser@remotehost:/home/remoteuser/example

Bash

单向同步 使用rsync命令时,默认情况下会进行双向同步。然而,有时我们只需将源目录复制到目标目录中。这就需要加上 --one-way

代码语言:javascript复制
rsync -avz --one-way /home/user/example remoteuser@remotehost:/home/remoteuser/example

Bash

备份 rsync命令不仅可以用来同步文件,还可以进行备份。如果要保留源目录的所有元数据和权限信息,需要在命令中添加-e选项:

代码语言:javascript复制
rsync -e "ssh -l remoteuser" -avz --delete /home/user/example remotehost:/backup/example

Bash

此命令将本地目录/home/user/example备份到远程计算机remotehost的/backup/example目录下,并使用ssh协议连接

过滤条目 您可以使用 rsync 命令中的 --exclude= 和 --include= 选项排除或包含特定文件或目录,例如:

代码语言:javascript复制
rsync -avz --exclude='*.log' /home/user/example remotehost:/home/remoteuser/example

Bash

此命令将 /home/user/example 目录同步到远程主机中 /home/remoteuser/example 目录。但 *.log 文件将被排除掉。

执行进度 rsync列出了它正在复制的文件。如果文件是很大的,则想要实时查看进度,则可以使用 --progress 选项:

代码语言:javascript复制
rsync -avz --progress /path/to/local/dir remoteuser@remotehost:/path/to/remote/dir

Bash

这会显示stdout中每个文件的传输状态以及预计完成的时间和速度.

本人遇到使用场景

一个非常小白的问题。 我是想合并两个目录,包括子目录。如果存在同名文件就替换。在Windows系统会直接移动,但是在Linux系统使用mv命令会遇到问题。如果目标目录的子目录有文件,就会报错----Directory not empty。这是因为mv命令会先删掉同名子目录再移动,如果同名子目录有文件就无法删掉,所以报错。 解决办法: 就是使用复制命令,比如cpscp以及rsync。先将源目录复制到目标目录,然后再删掉源目录即可。 rsync -ar /源目录/ /目标目录/

结语

脱衣服睡觉,禁止内卷!!!

0 人点赞