【发布时间】: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有特殊意义,必须转义。我能够使用ls和sed生成列表,在每行末尾附加一个正斜杠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