我正在尝试备份 NAS 驱动器上的主文件夹。我给出以下信息:
rsync -Paz --exclude-from 'rsync-exclude.txt' /home/chris/ [email protected]:LinuxHome
哪里rsync-exclude.txt
有这个内容:
/home/chris/Downloads/*
/home/chris/Downloads/
/home/chris/Downloads/*.*
并且它位于我执行 rsync 的同一文件夹中(主文件夹)。
然而 rsync 也尝试复制该文件夹。
我究竟做错了什么?
答案1
您正在提供绝对排除列表中的路径。
使用 rsync,所有以 开头的排除(或包含!)路径/
都锚定到“转移根源“。
在这种情况下,transfer 的根是/home/chris
。如果你这样做:
rsync -Paz --exclude-from 'rsync-exclude.txt' / [email protected]:`
…那么你的排除应该有效(但你会复制其他一切在该文件系统上!)。
但因为你只是想同步你的家目录,并且没有/home/chris
名为的子目录"home/chris/Downloads"
,rsync
因此找不到任何匹配项。
/home/chris
因此,请尝试从文件中删除这些部分rsync-exclude.txt
。
实际上,你只需要文件中的一行:
/Downloads
笔记如果您未指定前导/
,而您恰好有其他名为 的目录"Downloads"
,则这些目录也将被排除。我假设您只想排除“顶级”(相对于源目录,又称“传输根目录”)Downloads
目录,因此您需要前导/
。
最简单的方法(仅排除几条路径)
如果您只需要排除一个目录,只需执行以下操作(避免单独的文件):
rsync -Paz --exclude /Downloads /home/chris/ [email protected]:LinuxHome
您还可以将--exclude
标签链接在一起,如下所示:
rsync -Paz --exclude /Downloads --exclude '/Pictures' --exclude .cache \
/home/chris/ [email protected]:LinuxHome
请注意,在此示例中,由于.cache
没有前导斜杠,因此 rsync 将排除任何文件或目录命名.cache
自每一个传输的目录。您可以省略反斜杠 (\),只要在一行中输入所有内容即可。这与 rsync 无关。
如果您有多个排除项,最好使用--exclude-from
文件。
笔记
我发现你说的对,但是那些刚接触 rsync 的人应该注意末尾的斜线的/home/chris/
引用rsync
手册页,“您可以将源末尾的 / 视为‘复制此目录的内容’,而不是‘按名称复制目录’。”
因此,如果你去掉结尾的斜杠,你最终会得到一个chris
在目标目录中调用的目录,包含所有内容(当然,/home/chris
除了原始目录!)。Downloads
答案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)-release。