【问题标题】:rsync --exclude-from 'list' file not workingrsync --exclude-from 'list' 文件不工作
【发布时间】:2017-05-12 10:22:22
【问题描述】:

我正在尝试使用 rsync 完成从远程服务器到本地计算机的未完成传输

rsync -a user@domain.com:~/source/ /dest/

其中/dest/ 是部分完成传输的位置。但是,由于带宽问题,我需要在没有/dest/ 副本的另一台机器上运行rsync 到/tmp_dest/,然后我可以从那里将/tmp_dest/ 移动到/dest/

到目前为止,我想出的解决方案是使用 rync 的 --exclude-from 选项,使用包含来自 /dest/ 的完整文件列表的文件。

命令看起来像这样

rsync -a --exclude-from 'list.txt' user@domain.com:~/source/ /tmp_dest/

在这一点上,我感觉好像我已经到处寻找解决方案并尝试了我遇到的每一个变体。

这包括'list.txt' 的相对和绝对路径

亲戚:

path 1/file 1
path 2/file 2

--或--

绝对:

/absolute/source/path 1/file 1
/absolute/source/path 2/file 2

我已经尝试了上述组合,包括 - 以明确排除该行(我在其中看到有人想要 + 其他文件的示例)

- /absolute/source/path 1/file 1
- /absolute/source/path 2/file 2

我尝试在文件路径前加上前导**/,以纠正相对路径问题

**/path 1/file 1
**/path 2/file 2

我也尝试导航到包含'list' 的目录并从那里执行 rsync,以避免 rsync 查找的问题

/path/to/the/list/something1/to.exclude
/path/to/the/list/something2/to.exclude
/path/to/the/list/something3/to.exclude

毫无疑问,一无所获

我还确保在“列表”文件中使用了正确的换行符。 LF (Unix) 换行符。


我尝试使用以下命令创建'list'

find . -type f | tee list.txt

这最初创建了一个看起来像这样的文件

./yyyy-mm-dd folder 1/sub folder [foo]/file.a
./(yyyy) folder 2 {foo2}/file.b
./folder, 3/sub-folder 3/file.c

如您所见,文件路径中有空格和其他字符,但根据我目前的理解,这应该不会影响。但也许我弄错了,需要转义任何具有特殊含义的字符,然后我可能需要帮助

然后我在 notepad++ 或其他保留 LF (Unix) 换行符的文本编辑器中对 ./ 执行替换以获得所需的结果。 (例如如上所述,我尝试将./ 替换为空,/absolute/path/for/source/ 注明前导斜杠,甚至双通配符以匹配包含文件的任何父树结构。

我觉得我唯一没有尝试过的是转义文件名和路径中的空格,但我已经读过这应该不是问题。

也许我忽略了一些东西,任何帮助将不胜感激。

【问题讨论】:

  • 记事本++?您确定您使用的是 Linux 吗? :-P 无论如何,我做了一些测试,但我无法重现此故障。如果list.txt 中的路径相对于source/,开头没有./,有或没有-,有或没有**/,我的rsync 正确地将它们排除在传输之外。我的建议:看看您是否可以通过本地传输重现此问题,即只需在同一系统上的文件夹之间复制,只需几个文件。
  • Yes notepad++ @david-z :P 在 Windows 机器上(来自 atom.io 的 Atom 在启动时冻结,但这是另一天的另一个问题)。我正在使用 ssh 在有问题的 zfs 服务器上运行 rsync。我会试一试,虽然我开始认为这是[ 的特殊字符至少把它扔掉了。我不确定--exclude-from 使用什么“模式”(是正则表达式),但似乎有些字符需要转义link
  • 如果是这种情况,那么在不确切知道哪些文件名适合您哪些文件名不适合您的情况下,任何人都无法回答这个问题。我建议您通过小型本地传输来重现它的部分原因是,如果您自己不解决它,您可以发布一个complete 文件名列表,以便其他人重现该问题。
  • 在这里取得进展@davidz。我已经能够(大部分)使用大量文件夹样本集在本地工作。看来[确实对--exclude-from有特殊意义,必须转义。我能够使用lssed 生成列表,在每行末尾附加一个正斜杠s/$/\//,并使用s/\[/\\\[/g 全局转义所有开括号[,最终看起来有些东西像这样ls /source/ | sed 's/$/\//;s/\[/\\\[/g' | tee /home/rsync.exclude
  • 然后我用rsync -anv --exclude-from=/home/rsync.exclude /source/ /empty_dir/ | tee /home/rsync.output 之类的东西进行了测试。 rsync 没有排除的唯一文件夹在文件路径的开头出现了三个连续的点。在任何位置(包括末尾)具有三个连续点的其他文件夹不受影响。因此,foo.../ 将被排除在外,但 ...bar/ 不会。

标签: regex linux bash unix rsync


【解决方案1】:

这里是来自 rsync 手册页如何使用“--exclude-from”: --exclude-from=FILE 从 FILE 中读取排除模式

使用以下命令: rsync -a --exclude-from=list.txt user@domain.com:~/source/ /tmp_dest/

而且最好使用 list.txt 文件的完整路径名

【讨论】:

  • 谢谢,但rsync -anv --exclude-from=/home/rsync.exclude /source/ /empty_dir/rsync -anv --exclude-from '/home/rsync.exclude' /source/ /empty_dir/ 之间似乎没有区别。当我看到后者的常见用法时,我起初有点困惑,但据我所知,两者之间没有区别。您能否解释一下使用 list.txt 的完整路径名更好的意思。
  • 如果没有为 list.txt 文件使用完整路径名有问题,那么 rsync 会这样说。这个关于完整路径名的建议既不必要也不相关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 2012-02-01
  • 2010-12-21
  • 1970-01-01
  • 2022-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多