如何从 rsync 中排除文件夹

如何从 rsync 中排除文件夹

我正在尝试备份 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。

相关内容