我正在尝试在我的 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/chris从rsync-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/chris(Downloads当然,原始目录除外!)的所有内容。
小智 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。