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

时间:2013-05-20 10:26:05

标签: 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

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

有没有更好的方法可以在周一早上逃离我?

8 个答案:

答案 0 :(得分:152)

有一个标志--files-from可以完全满足您的需求。来自man rsync

--files-from=FILE
     

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

     
      
  • 暗示了--relative(-R)选项,它保留了为文件中的每个项目指定的路径信息(如果你想转,请使用--no-relative或--no-R关闭)。

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

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

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

  •   
     

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

rsync -a --files-from=/tmp/foo /usr remote:/backup
     

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

     

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

rsync -a --files-from=:/path/file-list src:/ /tmp/copy
     

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

     

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

     

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

答案 1 :(得分:9)

如果要保持绝对路径不变,

--files-from=参数需要尾随斜杠。所以你的命令会变成如下:

rsync -av --files-from=/path/to/file / /tmp/

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

find /var/* -name *.log > file

答案 2 :(得分:3)

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

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

OR

 rsync -aSvuc --recursive --files-from=rsync-src-files . /mnt/d/rsync_test/

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

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

folderName1
folderName2

答案 3 :(得分:1)

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

# rsync -avP -e ssh `cat deploy/rsync_include.txt` root@0.0.0.0:/var/www/

但是,假设您的列表不长,命令行长度将成为问题,rsync_include.txt文件只包含实际路径(即没有注释,也没有正则表达式)。< / p>

答案 4 :(得分:1)

我有类似的任务:同步给定日期之后修改的所有文件,但不包括某些目录。要构建一种班轮多合一样式很困难,因此我将问题分解成小块。 最终解决方案:

find  ~/sourceDIR -type f -newermt "DD MMM YYYY HH:MM:SS" | egrep -v "/\..|Downloads|FOO" > FileList.txt
rsync -v --files-from=FileList.txt ~/sourceDIR /Destination

首先,我使用find -L ~/sourceDIR -type f -newermt "DD MMM YYYY HH:MM:SS"。我尝试在regex行中添加find以排除名称模式,但是我的Linux(Mint)风格似乎无法理解find中的否定正则表达式。尝试过的正则表达式调味剂数量-无法按需使用。 因此,我最终得到了egrep -v-该选项不包括模式简便方法。我的rsync没有复制 /。cache /。config 之类的目录,也没有复制我明确命名的其他目录。

答案 5 :(得分:0)

此答案不是问题的直接答案。 但这可以帮助您确定哪种解决方案最适合您的问题。

分析问题时,应激活调试选项-vv

然后rsync将输出哪种模式包含或排除哪些文件:

building file list ... 
[sender] hiding file FILE1 because of pattern FILE1*
[sender] showing file FILE2 because of pattern *

答案 6 :(得分:0)

$ date
  Wed 24 Apr 2019 09:54:53 AM PDT
$ rsync --version
  rsync  version 3.1.3  protocol version 31
  ...

语法:rsync <file_/_folder_list> <source> <target>

文件夹名称(此处为经过培训的/;例如Cancer - Evolution/)位于文件夹列表文件中(例如:cm_folder_list_test):

# /mnt/Vancouver/projects/ie/claws/data/cm_folder_list_test
# test file: 2019-04-24
Cancer/
Cancer - Evolution/
Cancer - Genomic Variants/
Cancer - Metastasis (EMT Transition ...)/
Cancer Pathways, Networks/
Catabolism - Autophagy; Phagosomes; Mitophagy/
Catabolism - Lysosomes/

如果不包括结尾的/,则会创建rsync的目标文件夹,但它们为空。

这些文件夹名称将附加到其路径的其余部分(/home/victoria/Mail/2_RESEARCH - NEWS),从而提供rsync的完整文件夹路径;例如:/home/victoria/Mail/2_RESEARCH - NEWS/Cancer - Evolution/

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

rsync -aqP --delete --files-from=/mnt/Vancouver/projects/ie/claws/data/cm_folder_list_test "/home/victoria/Mail/2_RESEARCH - NEWS" $IN/

(在我的BASH脚本中,我如下定义了变量$IN。)

BASEDIR="/mnt/Vancouver/projects/ie/claws"
IN=$BASEDIR/data/test/input

使用的rsync选项:

 -a  :   archive: equals -rlptgoD (no -H,-A,-X)
    -r  :   recursive
    -l  :   copy symlinks as symlinks
    -p  :   preserve permissions
    -t  :   preserve modification times 
    -g  :   preserve group 
    -o  :   preserve owner (super-user only) 
    -D  :   same as --devices --specials 
  -q  :   quiet (https://serverfault.com/questions/547106/run-totally-silent-rsync)

  --delete
    This  tells  rsync to delete extraneous files from the RECEIVING SIDE (ones
    that AREN’T ON THE SENDING SIDE), but only for the directories that are
    being synchronized.  You must have asked rsync to send the whole directory
    (e.g.  "dir" or "dir/") without using a wildcard for the directory’s contents
    (e.g. "dir/*") since the wildcard is expanded by the shell and rsync thus
    gets a request to transfer individual files, not the files’ parent directory.
    Files  that  are  excluded  from  the transfer are also excluded from being
    deleted unless you use the --delete-excluded option or mark the rules as
    only matching on the sending side (see the include/exclude modifiers in the
    FILTER RULES section).  ...

答案 7 :(得分:0)

当我只有目录的列表时,这些答案都对我没有帮助。然后我偶然发现了解决方案!您必须将#Declaring randomly sampled validation indices ind <- sample(seq_len(nrow(xDF)), size = nrow(xDF)) n <- (nrow(xDF)/10) nr <- nrow(xDF) validation_ind <- split(ind, rep(1:ceiling(nr/n), each=n, length.out=nr)) #Looping through validation sets to obtain Model Performance measure of each set RMSEsF <- double(10) RMSEsFT <- double(10) R2F <- double(10) R2FT <- double(10) rsq <- function (x, y) cor(x, y) ^ 2 for (i in 1:10){ validate = as.data.frame(xDF[unlist(validation_ind[i]),]) train = as.data.frame(xDF[unlist(validation_ind[-i]),]) rf_train = randomForest(y~.,data=train,mtry=3) predictions_rf = predict(rf_train,validate) predictions_rft = predict(rf_train, train) RMSEsF[i] = RMSE(predictions_rf, validate$y) RMSEsFT[i] = RMSE(predictions_rft, train$y) R2F[i] = rsq(predictions_rf, validate$y) R2FT[i] = rsq(predictions_rft, train$y) print(".") } RMSEsF RMSEsFT 添加到-r,因为--files-from在这种情况下(谁知道?!)将不会递归。

-a