rsync --从“列表”文件中排除不工作

问题描述 投票:0回答:3

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

rsync -a [email protected]:~/source/ /dest/

其中

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

到目前为止我想出的解决方案是使用 rync 的

--exclude-from
选项,使用包含来自
/dest/
的完整文件列表的文件。

命令看起来像这样

rsync -a --exclude-from 'list.txt' [email protected]:~/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

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

然后,我在记事本 ++ 或其他保留

./

(Unix)换行符的文本编辑器中对 
LF
 进行替换,以获得所需的结果。
(
例如,如上所述,我尝试将 ./
 替换为空,用 
/absolute/path/for/source/
 指出前导斜杠,甚至使用双通配符来匹配包含文件的任何父树结构。

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

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

regex linux bash unix rsync
3个回答
0
投票
相对于源目录的路径应该有效。 例如:

rsync -ar test1/ test2/ --exclude-from=list.txt
给出以下目录结构

test1 ├── subdir │   ├── subdir2 │   └── testF3.txt ├── testF1.txt └── testF2.txt
排除文件:

testF2.* subdir/subdir2/*
您还可以使用 ** 来匹配任何子目录。

确保路径中没有任何额外的空格(包括尾随空格),因为它包含在模式中。


0
投票
如果您在源目录名称末尾使用斜杠,则您的排除模式是相对于源目录的,并且不能是绝对路径:

rsync -av --exclude-from=exclude-file.list /source/dir/ /backups/dir
# exclude-file.list
# Exclude everything under /source/dir/excluded
/excluded
而没有斜线:

rsync -av --exclude-from=exclude-file.list /source/dir /backups
# exclude-file.list
# Exclude everything under /source/dir/excluded
/source/dir/excluded

警告:排除不以斜杠开头的模式被视为未锚定到源目录,并且可以匹配路径的任何部分:

# exclude-file.list # Exclude everything under /source/dir/.git, /source/dir/project/.git, # as well as any files named .git .git
来自

rsync(1)

源上的尾部斜杠会更改此行为,以避免在目标上创建额外的目录级别。您可以将源上的尾随 / 视为“复制此目录的内容”而不是“按名称复制目录”,但在这两种情况下,包含目录的属性都会传输到目标上的包含目录。换句话说,以下每个命令都以相同的方式复制文件,包括它们对

/dest/foo

属性的设置:

rsync ‐av /src/foo /dest rsync ‐av /src/foo/ /dest/foo

    

-2
投票
以下是 rsync 手册页中如何使用“--exclude-from”的信息: --exclude-from=FILE 从 FILE 中读取排除模式

使用以下命令: rsync -a --exclude-from=list.txt

[电子邮件受保护]:~/source/ /tmp_dest/

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

© www.soinside.com 2019 - 2024. All rights reserved.