如何从rsync中排除文件夹

我正在尝试在我的NAS驱动器上备份我的主文件夹。 我这样说:

rsync -Paz --exclude-from 'rsync-exclude.txt' /home/chris/ admin@192.168.1.65:LinuxHome 

其中rsync-exclude.txt具有以下内容:

 /home/chris/Downloads/* /home/chris/Downloads/ /home/chris/Downloads/*.* 

它在我执行rsync(主文件夹)的同一文件夹中。

但是,rsync也会尝试复制此文件夹。

我究竟做错了什么?

问题是您正在指定完整的目录路径。

使用rsync,所有以/开头的排除(或包含)路径都锚定到传输 。 在这种情况下转移的根源是/home/chris 。 如果你这样做:

rsync -Paz --exclude-from 'rsync-exclude.txt' / admin@192.168.1.65:

…那么你的排除应该有效。

但是,由于您只是尝试同步主目录,并且没有名为home/chris/Downloads/home/chris子目录,它会忽略您的排除。

尝试从rsync-exclude.txt文件中删除/home/chris部分。

实际上,你应该在文件中只需要一行:

 /Downloads 

注意 :如果您没有指定前导/ ,并且您有一个名为/home/chris/special-stuff/Downloads ,那么也会将其排除在外。 我假设您只想排除您的“顶级”(相对于源目录,又称“传输根”) Downloads目录,因此您需要领先/

顺便提一下,如果您(文件中)只有(仅)行/Downloads/* ,它将确保目标上存在 Downloads目录,但不会复制其任何内容!

实际上,如果您只需要排除一个目录,那么执行此操作似乎更容易(根本没有排除文件):

 rsync -Paz --exclude /Downloads /home/chris/ admin@192.168.1.65:LinuxHome 

我知道你做对了,但rsync的新手应该注意/home/chris/末尾的斜杠。 引用rsync手册页,“你可以认为一个源的尾随/意思是’复制这个目录的内容’,而不是’按名称复制目录’。” 因此,如果你不使用这个尾部斜杠,你最终会在目标目录中找到一个名为chris的目录,其中包含/home/chris中的所有内容(当然,除了原始的Downloads目录之外)。