如何从 rsync 中排除文件夹

xpa*_*nta 61 rsync

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

rsync -Paz --exclude-from 'rsync-exclude.txt' /home/chris/ admin@192.168.1.65:LinuxHome
Run Code Online (Sandbox Code Playgroud)

哪里rsync-exclude.txt有这个内容:

/home/chris/Downloads/*
/home/chris/Downloads/
/home/chris/Downloads/*.*
Run Code Online (Sandbox Code Playgroud)

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

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

我究竟做错了什么?

Lam*_*art 93

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

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

在这种情况下转移的根是/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
Run Code Online (Sandbox Code Playgroud)

请注意,如果您没有指定领先的/,并且您碰巧有其他名为 的目录"Downloads",则这些目录也将被排除在外。我假设您只想排除您的“顶级”(相对于源目录,又名“传输根”)Downloads目录,因此您需要领先的/.

最简单的方法(仅排除少数路径)

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

rsync -Paz --exclude /Downloads /home/chris/ admin@192.168.1.65:LinuxHome
Run Code Online (Sandbox Code Playgroud)

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

rsync -Paz --exclude /Downloads --exclude '/Something Else' --exclude .hiddenFile /home/chris/ admin@192.168.1.65:LinuxHome
Run Code Online (Sandbox Code Playgroud)

请注意,由于没有斜杠,因此它将.hiddenFile从它复制的任何目录中排除!

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

笔记

我知道你做对了,但是那些刚接触 rsync 的人应该注意末尾斜杠/home/chris/

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

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


小智 5

这可能看起来更容易,只需注意排除目录和语法:

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 \
Run Code Online (Sandbox Code Playgroud)

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

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