我正在尝试使用 rsync 备份机器,在阅读了大量 SO QA 和手册页后,我仍然无法理解包含/排除优先级如何工作,以便我可以传输正确的文件集。混淆具体细节,我正在尝试以下操作:
递归包含:
/home/erik/foo
/home/erik/bar
/home/erik/baz
Run Code Online (Sandbox Code Playgroud)
递归地包含 /git,但排除一些特定的子目录,例如 /git/src/github.com/foo 和 /git/src/github.com/bar。
到目前为止,我认为 rsync 命令应该可以完成此任务。事实并非如此,我尝试了许多以不同方式失败的变体:
rsync -am \
--include='*/' \
--include='/home/erik/foo' \
--include='/home/erik/bar' \
--include='/home/erik/baz' \
--include='/git' \
--exclude='/git/bin' \
--exclude='/git/src/github.com/foo' \
--exclude='/git/src/github.com/bar' \
--exclude='*' \
/ nfs.example.com:/data/pool/backup/laptop
Run Code Online (Sandbox Code Playgroud)
一些具体问题:
我已经多次看到它建议最初的 --include='*/ 是必要的,尽管我不完全确定为什么。我认为它与确保目录扩展和遵循有关(?)。我还假设最终排除是排除与更高语句不匹配的任何文件?有人可以详细说明这些是否都是必要的,并且它们的立场是否重要?
我不确定目录是否需要前导 /。我已经看到这些路径与请求的 / 传输根相关的提示,这表明它应该类似于 home/erik,但我也没有成功。有人可以扩展一下这是如何工作的吗?
我不确定如果我想包含目录和所有子内容,路径中是否需要后缀 / ?
有人可以详细说明参数的位置是否实际上很重要,即将应用列表中第一个匹配的位置?
有什么理由让我更喜欢 --filter='+ X' 而不是 --include ?排除也一样吗?
--dry-runrsync 命令的选项有什么作用?在我当前工作的网络上,它似乎产生了一个很长的文件列表,这不是很有用。
以下是一些进一步的细节:
我最近(终于)开始在 TrueNAS 机器上部署 samba 共享。它必须是 samba,因为我同时使用 Linux、Windows,有时还使用 OS X 系统,因此我需要一个网络存储位置,如果需要,我可以从所有这三个系统中使用它。
我现在正在努力将数据从随机的硬盘阵列移动到 TrueNAS 系统上的存储池。我发现执行此操作的最简单方法是在 TrueNAS 系统上使用 rsync 服务器,并在客户端上使用 rsync 发送数据。
我从中复制数据的某些驱动器具有相同目录名称的多个副本。但我不能保证它们是相同的,因为其中一些是后来制作的。
警告:我不能依赖文件的时间戳。原因:在开始此数据迁移之前,我将大量内容移至单个磁盘。
示例:我有一个 3TB 驱动器的磁盘,其中包含以下内容
Documents-backup/...
Documents-backup_2/... # same directory structure as Documents-backup,
# may or may not be identical
Run Code Online (Sandbox Code Playgroud)
然后另一个驱动器包含
Documents-backup/... # may or may not be identical to dir on another disk
Run Code Online (Sandbox Code Playgroud)
其中一些文件夹的大小很大,内容超过 100 GB。
我想做的就是使用 rsync 来:
我认为以下命令可以做到这一点:
rsync -a -c --progress --dry-run ./local-path user@ipaddress::rsyncservername/remote-path
Run Code Online (Sandbox Code Playgroud)
然而,据我所知,这一切都是在打印所有正在检查的文件的列表,而不是具有不同校验和的文件。
不幸的是,尝试不断地复制大量数据是至关重要的。我想rsync在一个方向上处理所有数据,几乎rsync只是破坏目标服务器上的内容。有没有办法执行rsync并只是说“覆盖所有文件”
有更好的方法吗?我们谈论的是 500GB 的数据,只需朝一个方向传输。
我在存储中有一组文件,我只想获取新文件并将其放在另一个目录中。有没有办法做到这一点?
例如:
“旧文件”包含在:文件夹/旧文件中
我希望将来自 rsync 的新文件放入文件夹/ [并且我的脚本将在处理文件后将其放入旧文件中]
有没有办法用 rsync 做到这一点?
是否可以在不先下载的情况下将文件从一台服务器复制到另一台服务器?
我有一个 10gb 的备份文件,我想将它从我的生产服务器复制到我的登台服务器。
目前我只是通过传输来完成它,但是首先下载文件,然后上传它。
有没有办法直接将文件从生产服务器移动到登台服务器?SCP 是这样做还是先下载它?rsync 怎么样?
编辑
两者都是运行 Ubuntu 14.04 LTS 的 Linux 服务器。
我需要中断并重新启动 Linux 复制操作。做这个的最好方式是什么?
我目前正在将数据从一台 Debian PC 复制到另一台。我通过以下方式开始此操作sshfs,tar但没有使用要求sshfs,也没有tar其他可靠的方法是否足够:
local$ mkdir /path/to/remote-sdb1
local$ sshfs root@remote:/mnt/sdb1 /path/to/remote-sdb1
local$ tar cf - /path/to/local/data/to/copy | tar xf - -C /path/to/remote-sdb1 &
Run Code Online (Sandbox Code Playgroud)
远程盒子是系统救援 CD 的一次性启动,没有本地操作系统,并且位于我的防火墙内,因此我不太关心以 root 身份登录,除非有人提出其他意见。
这比我最初预期的时间要长,因此我需要中断操作以关闭远程盒电源几分钟。
当我重新启动它时,我知道我无法恢复 tar 操作;相反,是否有类似rsync命令的东西可以让我轻松地从中断处恢复并完成传输,包括在中断操作时完成正在进行的文件的拙劣传输?
完成后,我计划运行此rsync答案中的命令来验证传输是否成功完成,除非有人建议这是多余的:
local$ rsync -niaHc /path/to/local/data/to/copy/ /path/to/remote-sdb1/path/to/local/data/to/copy
Run Code Online (Sandbox Code Playgroud)
(如帖子中所述,我需要小心以 . 结尾第一个文件夹名称/。)
这似乎是一个非常简单的请求,但我已经用 rsync 将头撞在墙上大约一个小时了,所以我想我只是问一下。我只是尝试使用 rsync 将本地目录到远程目录中的一组特定文件列入白名单。
让我们想象一下,现在我只想发送*.ts根目录中的文件。因此,将其想象为源结构:
/foo
bar.ts
baz.ts
package.json
node_modules/...
other_dir/...
Run Code Online (Sandbox Code Playgroud)
在此示例中,我只想发送bar.ts和baz.ts。
我想做的就是这样:
rsync --include-from include.txt foo remotehost:foo
其中include.txt仅包含:
*.ts
Run Code Online (Sandbox Code Playgroud)
当我尝试这样做时,我发现skipping directory .如果我有一个列表,为什么会发生这种情况include-from?
所以然后我尝试使用存档/递归模式(但这不是我想要的,因为我只是想指定一个列表......但无论如何让我们尝试一下):
rsync -a --include-from include.txt foo remotehost:foo
这样就复制了所有内容foo并忽略了include-from.
然后我尝试了:
rsync -a --exclude '*' --include-from include.txt foo remotehost:foo
我认为模式是从左到右评估的,所以我希望这仅包括我的列表中的文件,但它排除了它们,因为它们与模式“*”匹配
再说一遍,这似乎是一件非常基本的事情,我不知道为什么让 rsync 做到这一点如此具有挑战性。
我在这里缺少什么?
我在家里运行 Linux Mint 工作站,我正在遵循此页面的备份策略:http : //www.jwz.org/doc/backups.html。目标驱动器是一个与内部驱动器相同的 eSata 驱动器,我的 rsync 命令如下所示:
sudo rsync -vaxAX --delete --ignore-errors / /media/backup/
Run Code Online (Sandbox Code Playgroud)
我的外部 eSata 驱动器安装在 /media/backup/ 上。我在使用这个 rsync 命令时遇到了一个小问题:rsync 不会进入 /home 目录并向下递归。home/ 目录是在目的地创建的,但它停在那里。如果我将我的源目录从 / 更改为 /home/ 则一切都很好。我做错了什么还是这种行为是故意的?
我已经创建了一个.bat文件来运行我的 cwRsync 脚本。
从 CMD 行,这很好用:
rsync -avz ./ {destination} --chmod=ugo=rwX --rsh "ssh -i id_rsync -p 9672" --recursive --delete
现在,如果我把它放在一个.bat文件中,它就会进入一个无限循环。这是我的 bat 文件:
@ECHO OFF
ECHO ** Pushing files **
SET CWLOCAL = "C:/dev/view-resources"
SET CWREMOTE = "user@mydevserver.com:/home/dev"
SET EXLUDES = "--exclude=.git* --exclude=*.scss --exclude=cache"
rsync -avz %CWLOCAL% %CWREMOTE% --chmod=ugo=rwX --rsh "ssh -i id_rds -p 9672" --recursive %EXCLUDES% --delete
Run Code Online (Sandbox Code Playgroud)
为什么这个 .bat 文件会循环?我尝试end在最后添加,但这无济于事。
该手册没有指定(也没有排除)我是否可以在命令行上--exclude-from=FILE多次指定,如下所示:
rsync -av --exclude-from=FILE1 --exclude-from=FILE2 source destination
Run Code Online (Sandbox Code Playgroud)
那么是否可以指定不同的排除文件?
-a所以我读了谷歌搜索手册,但没有足够的信息来说明这个 rsync标志的真正用途
手册上说要提供存档。它与 中的存档相同吗tar?
我只是不能直接假设,所以我必须在这里问。