如何从rsync中排除文件夹


60

我正在尝试将我的主文件夹备份到我的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也会尝试复制此文件夹。

我究竟做错了什么?

Answers:


88

您在排除列表中提供了绝对路径。

使用rsync时,所有以(exit)开头的排除(或include!)路径/都将锚定到“ 传输根 ”。

在这种情况下,转移的根源是/home/chris。如果您这样做:

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

...那么您的排除项应该起作用了(但是您将复制该文件系统上的所有其他内容!)。

但是由于您只是尝试同步目录,并且没有/home/chrisnamed的子目录"home/chris/Downloads",所以rsync找不到匹配的内容。

因此,请尝试/home/chrisrsync-exclude.txt文件中删除这些部分。

实际上,您只需要在文件中添加一行:

/Downloads

请注意,如果您未指定前导/,而您碰巧有其他名为的目录"Downloads",则这些目录也将被排除。我假设您只想排除“顶层”目录(相对于源目录,又称“传输根Downloads目录”)目录,所以您需要使用领先目录/

最简便的方法(仅排除一些路径)

如果您只需要排除一个目录,请执行此操作(避免使用单独的文件):

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

您还可以将--exclude标签链接在一起,如下所示:

rsync -Paz --exclude /Downloads --exclude '/Something Else' --exclude .hiddenFile /home/chris/ admin@192.168.1.65:LinuxHome

需要注意的是,因为没有斜杠,其中一个将排除.hiddenFile任何每个目录它复制!

但是,如果您有多个排除项,那么最好使用--exclude-from和一个文件。

注意

我看到你这样做是正确的,但这些新的rsync应该注意最后的斜杠/home/chris/

引用rsync手册页,“您可以认为源上的尾随/的意思是'复制此目录的内容',而不是'按名称复制目录'。”

因此,如果不使用斜杠,则最终将chris在目标目录中找到一个目录,其中包含目录中的所有内容/home/chrisDownloads当然,原始目录除外!)。


2

这样做可能会更容易一些,仅注意排除目录和语法:

SRC='/home/username'
DST='/run/media/username/EasyStoreRT/rsync'

rsync -avrh --stats                                 \
    --log-file=/home/username/log/rsync-home.log    \
    --exclude='/username/.cache'                    \
    --exclude='/username/.local/share/Trash'        \
    $SRC \
    $DST \

它将排除那些目录及其中的所有文件。无论出于何种原因,rysnc都没有将/ home / username附加到/.cache。只有home /会自行定位,因此我必须将/ username添加到每个排除的目录中。

手册页说:“如果模式以/开头,那么它将锚定到文件层次结构中的特定位置,否则它将与路径名的末尾匹配。” 但是,该层次结构似乎只是源目录中的第一个目录。我正在使用bash,版本4.4.23(1)-发行版。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.