如何rsync只有一个特定的文件列表?

Dan*_*ele 74 rsync

我在各个子目录中大约有50个左右的文件,我想将它们推送到远程服务器.我认为rsync可以使用--include-from选项为我做这个.如果没有--exclude ="*"选项,目录中的所有文件都将被同步,选项中没有文件.

rsync -avP -e ssh --include-from=deploy/rsync_include.txt --exclude=* ./ root@0.0.0.0:/var/www/ --dry-run
Run Code Online (Sandbox Code Playgroud)

我最初是以干的方式运行它,0.0.0.0显然被远程服务器的IP取代.rsync_include.txt的内容是一个新的行分隔列表,列出了我要上传的文件的相对路径.

是否有一种更好的方法可以在星期一早上逃离我?

atp*_*atp 179

有一面旗帜--files-from完全符合您的要求.来自man rsync:

--files-from=FILE
Run Code Online (Sandbox Code Playgroud)

使用此选项可以指定要传输的文件的确切列表(从指定的FILE读取或 - 用于标准输入).它还调整了rsync的默认行为,以便更轻松地传输指定的文件和目录:

  • 隐含了--relative(-R)选项,它保留为文件中的每个项指定的路径信息(如果要关闭它,请使用--no-relative或--no-R).

  • 隐含了--dirs(-d)选项,它将创建目标列表中指定的目录,而不是吵闹地跳过它们(如果要关闭它,请使用--no-dirs或--no-d).

  • --archive(-a)选项的行为并不意味着--recursive(-r),因此如果需要,请明确指定它.

  • 这些副作用会改变rsync的默认状态,因此命令行中--files-from选项的位置与其他选项的解析方式无关(例如-a在-files-之前或之后的作用相同)来自--no-R和所有其他选项).

从FILE读取的文件名都相对于源目录 - 删除了任何前导斜杠,并且不允许".."引用高于源目录.例如,执行以下命令:

rsync -a --files-from=/tmp/foo /usr remote:/backup
Run Code Online (Sandbox Code Playgroud)

如果/ tmp/foo包含字符串"bin"(或甚至是"/ bin"),则/ usr/bin目录将在远程主机上创建为/ backup/bin.如果它包含"bin /"(注意尾部斜杠),则还将发送目录的直接内容(无需在文件中明确提及 - 这从版本2.6.4开始).在这两种情况下,如果启用了-r选项,那么dir的整个层次结构也将被转移(请记住-r需要使用--files-from显式指定,因为它不是-a所暗示的).另请注意,(相关默认情况下启用)--relative选项的效果是仅复制从文件中读取的路径信息 - 它不会强制复制源规范路径(在这种情况下为/ usr) .

此外,如果在文件前指定"host:"(主机必须匹配传输的一端),则可以从远程主机而不是本地主机读取--files-from文件.作为快捷方式,您只需指定":"前缀即可表示"使用传输的远程端".例如:

rsync -a --files-from=:/path/file-list src:/ /tmp/copy
Run Code Online (Sandbox Code Playgroud)

这将复制位于远程"src"主机上的/ path/file-list文件中指定的所有文件.

如果指定了--iconv和--protect-args选项,并且--files-from文件名从一个主机发送到另一个主机,则文件名将从发送主机的charset转换为接收主机的charset.

注意:对--files-from输入中的文件列表进行排序有助于rsync更高效,因为它将避免重新访问相邻条目之间共享的路径元素.如果未对输入进行排序,则某些路径元素(隐含目录)最终可能会被多次扫描,并且rsync最终会在转换为文件列表元素后将其重复.

  • 请注意,您仍然需要指定列出的文件所在的目录,例如:`rsync -av --files-from = file-list.target /`用于从当前目录复制文件. (18认同)
  • 是的,并重申:`从FILE读取的文件名都是相对于源dir`. (6认同)

Waq*_*han 11

--files-from=如果要保持绝对路径不变,则参数需要尾随斜杠.所以你的命令会变成如下:

rsync -av --files-from=/path/to/file / /tmp/
Run Code Online (Sandbox Code Playgroud)

这可以像有大量文件一样完成,并且您希望将所有文件复制到x路径.所以你会找到文件并将输出抛出到如下文件:

find /var/* -name *.log > file
Run Code Online (Sandbox Code Playgroud)


K F*_*K F 7

根据记录,除了一个答案以外,以上所有答案均无济于事。总而言之,您可以--files-from=使用以下任一方法执行备份操作:

 rsync -aSvuc`cat rsync-src-files` / mnt / d / rsync_test /

要么

rsync -aSvuc-递归--files-from = rsync-src-files。/ mnt / d / rsync_test /

前一个命令是不言自明的,在文件内容旁边rsync-src-files,我将在下面详细说明。现在,如果要使用后者,则需要牢记以下四个注意事项:

  1. 注意一个需要同时指定--files-from目录
  2. 需要明确指定--recursive
  3. 该文件rsync-src-files是用户创建的文件,已放置在此测试的src目录中
  4. rsyn-src-files所包含的文件和文件夹复制和它们相对于源目录中取。重要说明:确保文件中没有尾随空格或空白行。在下面的示例中,只有两行,而不是三行(偶然发现)。的内容rsynch-src-files是:

folderName1
folderName2


Vic*_*art 6

$ date\n  Wed 24 Apr 2019 09:54:53 AM PDT\n$ rsync --version\n  rsync  version 3.1.3  protocol version 31\n  ...\n
Run Code Online (Sandbox Code Playgroud)\n

句法:rsync <args> <file_and_or_folder_list> <source_dir> <destination_dir/>

\n

文件夹名称 - 尾随/; 例如Cancer - Evolution/- 在文件中提供(例如my_folder_list):

\n
# comment: /mnt/Vancouver/my_folder_list\n# comment: 2019-04-24\nsome_file\nanother_file\nCancer/\nCancer - Evolution/\nCancer - Genomic Variants/\nCancer - Metastasis (EMT Transition ...)/\nCancer Pathways, Networks/\nCatabolism - Autophagy; Phagosomes; Mitophagy/\n
Run Code Online (Sandbox Code Playgroud)\n

所以这些是要进行 rsync 的“源”(文件和/或)文件夹。

\n

请注意,如果您不包含/上面显示的尾随,rsync则会创建目标文件夹,但它们是空的。

\n
\n

中提供的文件夹名称<file_and_or_folder_list>将附加到其路径的其余部分:<src_dir>= /home/victoria/RESEARCH - NEWS(此处位于不同的分区上),从而为 rsync 提供完整的文件夹路径;例如:/home/victoria/RESEARCH - NEWS/Cancer - Evolution/……

\n

[我稍后(2022-07)编辑这个答案,我不记得提供的路径是否是<src_dir>/home/victoria/RESEARCH - NEWS-/home/victoria/RESEARCH - NEWS/提供正确的串联路径。我相信是前者;如果它不起作用,请使用后者。]

\n
\n

请注意,您还需要使用--files-from=...,而不是--include-from=...

\n

语法又rsync是:

\n

rsync <args> <file_and_or_folder_list> <source_dir> <destination_dir/>

\n

所以,

\n

rsync -aqP --delete --files-from=/mnt/Vancouver/my_folder_list "/home/victoria/RESEARCH - NEWS" $DEST_DIR/

\n

在哪里

\n
    \n
  • <args>-aqP --delete
  • \n
  • <file_and_or_folder_list>--files-from=/mnt/Vancouver/my_folder_list
  • \n
  • <source_dir>"/home/victoria/RESEARCH - NEWS"
  • \n
  • <destination_dir/>是(注意添加到变量名称的$DEST_DIR/尾随)/
  • \n
\n

在我的 BASH 脚本中,为了编码灵活性,我将变量定义$DEST_DIR为两部分,如下所示。

\n
BASEDIR="/mnt/Vancouver"\nDEST_DIR=$BASEDIR/data\necho $DEST_DIR                 ## /mnt/Vancouver/data\n\n## To clarify, here is $DEST_DIR with / appended to the variable name:\necho $DEST_DIR/                ## /mnt/Vancouver/data/\necho $DEST_DIR/apple/banana    ## /mnt/Vancouver/data/apple/banana\n
Run Code Online (Sandbox Code Playgroud)\n

但是,您可以更简单地指定目标路径:

\n
    \n
  • 通过 BASH 变量:$DEST_DIR=/mnt/Vancouver/data

    \n
      \n
    • 请注意,在rsync上面的表达式中,/附加到$DEST_DIR(即$DEST_DIR/实际上是$DEST_DIR+ /),给出目标目录路径/mnt/Vancouver/data/
    • \n
    \n
  • \n
  • 明确指定目标路径:/mnt/Vancouver/data/

    \n
  • \n
\n
\n

使用的 rsync 选项: ##man rsyncrsync -h

\n
 -a  :   archive: equals -rlptgoD (no -H,-A,-X)\n    -r  :   recursive\n    -l  :   copy symlinks as symlinks\n    -p  :   preserve permissions\n    -t  :   preserve modification times\n    -g  :   preserve group\n    -o  :   preserve owner (super-user only)\n    -D  :   same as --devices --specials\n\n  -P  :  same as --partial --progress\n\n  -q  :   quiet (https://serverfault.com/questions/547106/run-totally-silent-rsync)\n\n  --delete\n    This  tells  rsync to delete extraneous files from the RECEIVING SIDE (ones\n    that AREN\xe2\x80\x99T ON THE SENDING SIDE), but only for the directories that are\n    being synchronized.  You must have asked rsync to send the whole directory\n    (e.g.  "dir" or "dir/") without using a wildcard for the directory\xe2\x80\x99s contents\n    (e.g. "dir/*") since the wildcard is expanded by the shell and rsync thus\n    gets a request to transfer individual files, not the files\xe2\x80\x99 parent directory.\n    Files  that  are  excluded  from  the transfer are also excluded from being\n    deleted unless you use the --delete-excluded option or mark the rules as\n    only matching on the sending side (see the include/exclude modifiers in the\n    FILTER RULES section).  ...\n
Run Code Online (Sandbox Code Playgroud)\n


Wes*_*ker 4

编辑:下面 atp 的答案更好。请使用那个!

如果您正在查找特定的文件列表,则可以将它们直接放在命令行上,这样您可能会更轻松:

# rsync -avP -e ssh `cat deploy/rsync_include.txt` root@0.0.0.0:/var/www/
Run Code Online (Sandbox Code Playgroud)

但是,这是假设您的列表不太长,以至于命令行长度将成为问题,并且文件rsync_include.txt仅包含真实路径(即没有注释,也没有正则表达式)。

  • 不幸的是,这不适用于大型列表或名称中带有空格的文件。 (10认同)
  • [参数列表太长] (3认同)