停止 rsync 而不留下临时文件

停止 rsync 而不留下临时文件

使用以下命令将文件从目录复制A到时Brsync

$ rsync -a --backup --suffix=.$(date +"%Y%m%d%H%M%S")  A/ B/

filename调用的文件在传输时A将暂时被称为表单上的某些内容。也就是说,在名称中添加一些随机字符,直到传输完成。.filename.9TcfsaBrsync

如果我在传输时rsyncCtrl+中断,临时文件将保留在.由于我的命令永远不会从 中删除任何文件,因此每次中断都会在 中留下另一个临时文件。这变成了烦人的垃圾。cfilename.filename.9TcfsaBrsyncBrsyncB

是否可以停止rsync并删除临时文件?

更新: 由于其他人似乎没有遇到上述问题,因此我提供了一个带有输出的脚本来演示我在计算机上看到的内容。

脚本rsynctest.sh

#/!bin/bash
mkdir -p A
mkdir -p B
echo "Creating a 1 GB file in A..."
dd if=/dev/zero of=A/bigfile bs=1M count=1000 >& /dev/null
echo "Now press CTRL-C to interrupt rsync."
rsync -a --backup --suffix=.$(date +"%Y%m%d%H%M%S")  A/ B/

运行脚本两次时的输出:

$ ./rsynctest.sh 
Creating a 1 GB file in A...
Now press CTRL-C to interrupt rsync.
^Crsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(632) [sender=3.1.0]
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at io.c(521) [generator=3.1.0]
$ ./rsynctest.sh 
Creating a 1 GB file in A...
Now press CTRL-C to interrupt rsync.
^Crsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(632) [sender=3.1.0]
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at io.c(521) [generator=3.1.0]
$ ls -a B
.  ..  .bigfile.KvDV0T  .bigfile.MbalWJ
$

请注意,最后一个ls命令显示B包含两个临时文件。

答案1

答:这是rsync3.1.0中的一个错误。

这是来自3.1.1.发行说明,

修复了中断时无法删除部分传输临时文件的问题(并且 rsync 不保存部分文件)。

升级您的rsync.

以前的东西

我刚刚在我的系统上测试了这一点。

tony@trinity:~$ uname -a
Linux trinity 3.2.0-4-686-pae #1 SMP Debian 3.2.73-2+deb7u2 i686 GNU/Linux
tony@trinity:~$ cat /etc/debian_version
7.10
tony@trinity:~$ rsync --version
rsync  version 3.0.9  protocol version 30

所以不是完全相同的版本rsync,而是相同的主要版本。

正如预期的那样,当我点击Ctrl+时crsync会进行清理并且不会留下任何临时文件。

我创建了A/B/,填充了A/一些文件,然后运行rsync一次来​​填充B/。然后我就跑touch进去A/再跑rsync一次。

我添加了一个-v,这样我就可以看到它正在处理哪个文件,但如果没有 -v,行为是相同的。

tony@trinity:~$ rsync -v -a --backup --suffix=.$(date +"%Y%m%d%H%M%S")  A/ B/
sending incremental file list
archives/floppies.tgz
archives/fromx1.tgz
archives/homestuff.tgz
^Crsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(549) [sender=3.0.9]
tony@trinity:~$ cd B
tony@trinity:~/B$ cd archives/
tony@trinity:~/B/archives$ ls -l
total 78620
-rw-r----- 1 tony tony  7031885 Apr 15 14:44 floppies.tgz
-rw-r----- 1 tony tony  7031885 Apr 15 14:37 floppies.tgz.20160415144513
-rw-r--r-- 1 tony tony 13959801 Apr 15 14:44 fromx1.tgz
-rw-r--r-- 1 tony tony 13959801 Apr 15 14:37 fromx1.tgz.20160415144513
-rw-r--r-- 1 tony tony 26136212 Apr 15 14:37 homestuff.tgz
-rw-r----- 1 tony tony  5727535 Apr 15 14:37 legacy-x1-scripts.tgz
-rw-r----- 1 tony tony  6636756 Apr 15 14:37 olddos.tgz
drwxr-xr-x 2 tony tony     4096 Apr 15 14:44 oldsites
drwxr-xr-x 2 tony tony     4096 Apr 15 14:44 temp

没有临时文件。所以,也许因为内容没有改变,rsync不需要创建临时文件。

这次,我有一个大文件A\

tony@trinity:~$ ls -l A/
total 561528
-rw-r--r-- 1 tony tony 574996664 Apr 15 14:52 bigfile.tgz

我同步B/

tony@trinity:~$ rsync -v -a --backup --suffix=.$(date +"%Y%m%d%H%M%S") A/ B/
sending incremental file list
bigfile.tgz

sent 575066959 bytes  received 31 bytes  10953656.95 bytes/sec
total size is 574996664  speedup is 1.00

然后,完全bigfile.tgz用其他东西代替。

tony@trinity:~$ ls -l A/
total 572576
-rw-r--r-- 1 tony tony 586311642 Apr 15 14:57 bigfile.tgz

这是一个不同的 tgz 存档,只是一遍又一遍地复制以组成相同的文件大小。

tony@trinity:~$ rsync -v -a --backup --suffix=.$(date +"%Y%m%d%H%M%S") A/ B/
sending incremental file list
bigfile.tgz
^Crsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(549) [sender=3.0.9]
tony@trinity:~$ ls -l B/
total 561528
-rw-r--r-- 1 tony tony 574996664 Apr 15 14:52 bigfile.tgz

没有临时文件。

重新开始,新文件。

tony@trinity:~$ ls -l A/
total 433908
-rw-r--r-- 1 tony tony 444315604 Apr 15 15:02 bigfile.tgz

同步至B/

tony@trinity:~$ rsync -v -a --backup --suffix=.$(date +"%Y%m%d%H%M%S")  A/ B/
sending incremental file list
bigfile.tgz

sent 444369947 bytes  received 31 bytes  32916294.67 bytes/sec
total size is 444315604  speedup is 1.00

现在,A/bigfile.tgz用不同的内容重新创建,

tony@trinity:~$ ls -l A/
total 545312
-rw-r--r-- 1 tony tony 558392040 Apr 15 15:04 bigfile.tgz

这次,运行rsyncwith--partial看看有什么变化。该开关通常会强制rsync留下部分文件而不是清除它们。

tony@trinity:~$ rsync -v -a --backup --suffix=.$(date +"%Y%m%d%H%M%S") --partial A/ B/
sending incremental file list
bigfile.tgz
^Crsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(549) [sender=3.0.9]
tony@trinity:~$ ls -l B/
total 464596
-rw-r--r-- 1 tony tony  31424512 Jan  1  1970 bigfile.tgz
-rw-r--r-- 1 tony tony 444315604 Apr 15 15:02 bigfile.tgz.20160415150558

这次,我们rsync已经创建了一个临时文件(称为 bigfile.tgz),旧文件已被赋予新扩展名。

编辑:再次使用一组测试ls -la

tony@trinity:~$ ls -la A/
total 510488
drwxr-xr-x  2 tony tony      4096 Apr 15 15:22 .
drwxr-xr-x 89 tony tony      4096 Apr 15 15:12 ..
-rw-r--r--  1 tony tony 522724240 Apr 15 15:22 bigfile.tgz

tony@trinity:~$ rsync -v -a --backup --suffix=.$(date +"%Y%m%d%H%M%S") A/ B/
sending incremental file list
bigfile.tgz

sent 522788155 bytes  received 31 bytes  22246305.79 bytes/sec
total size is 522724240  speedup is 1.00

所以B/是同步的,

tony@trinity:~$ ls -la B/
total 510484
drwxr-xr-x  2 tony tony      4096 Apr 15 15:23 .
drwxr-xr-x 89 tony tony      4096 Apr 15 15:12 ..
-rw-r--r--  1 tony tony 522724240 Apr 15 15:22 bigfile.tgz

替换A/bigfile.tgz并重新同步。

tony@trinity:~$ ls -la A/
total 545320
drwxr-xr-x  2 tony tony      4096 Apr 15 15:24 .
drwxr-xr-x 89 tony tony      4096 Apr 15 15:12 ..
-rw-r--r--  1 tony tony 558392040 Apr 15 15:24 bigfile.tgz

tony@trinity:~$ rsync -v -a --backup --suffix=.$(date +"%Y%m%d%H%M%S") A/ B/
sending incremental file list
bigfile.tgz
^Crsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(549) [sender=3.0.9]
tony@trinity:~$ ls -la B/
total 510484
drwxr-xr-x  2 tony tony      4096 Apr 15 15:25 .
drwxr-xr-x 89 tony tony      4096 Apr 15 15:12 ..
-rw-r--r--  1 tony tony 522724240 Apr 15 15:22 bigfile.tgz

没有临时文件。

我无法使用 basic 重新创建您描述的行为rsync

您确定您的rsync命令与描述的完全一致,并且您确定它没有在某个地方别名为其他命令吗?

更新:

在另一台机器上使用您的脚本,

tony@matrix:~$ ./rsynctest.sh
Creating a 500 MB file in A...
Now press CTRL-C to interrupt rsync.
^Crsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(632) [sender=3.1.1]
rsync: [sender] write error: Broken pipe (32)
tony@matrix:~$ ls -la B/
total 8
drwxr-xr-x  2 tony users 4096 Apr 15 19:54 .
drwxr-xr-x 37 tony users 4096 Apr 15 19:54 ..
tony@matrix:~$ ./rsynctest.sh
Creating a 500 MB file in A...
Now press CTRL-C to interrupt rsync.
^Crsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(632) [sender=3.1.1]
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at io.c(504) [generator=3.1.1]
tony@matrix:~$ ls -la B/
total 8
drwxr-xr-x  2 tony users 4096 Apr 15 19:54 .
drwxr-xr-x 37 tony users 4096 Apr 15 19:54 ..

tony@matrix:~$ uname -a
Linux matrix 3.12.46-guest-39-a97a54c-x86_64 #4 SMP Mon Aug 10 11:59:25 UTC 2015 x86_64 GNU/Linux
tony@matrix:~$ cat /etc/debian_version
8.3
tony@matrix:~$ rsync --version
rsync  version 3.1.1  protocol version 31

另一台机器,这次是 Ubuntu 而不是纯粹的 Debian。

tony@neo:/$ lsb_release -r
Release:        15.10
tony@neo:/$ uname -a
Linux neo 4.2.0-34-generic #39-Ubuntu SMP Thu Mar 10 22:13:01 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
tony@neo:/$ rsync --version
rsync  version 3.1.1  protocol version 31
Copyright (C) 1996-2014 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
    append, ACLs, xattrs, iconv, symtimes, prealloc

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.

tony@neo:~$ vi rsynctest.sh
tony@neo:~$ chmod 755 rsynctest.sh
tony@neo:~$ ./rsynctest.sh
Creating a 1 GB file in A...
Now press CTRL-C to interrupt rsync.
^Crsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(632) [sender=3.1.1]
rsync: [receiver] write error: Broken pipe (32)
rsync: [sender] write error: Broken pipe (32)
tony@neo:~$ ls -la B/
total 8
drwxrwxr-x  2 tony tony 4096 Apr 15 20:09 .
drwxr-xr-x 20 tony tony 4096 Apr 15 20:09 ..
tony@neo:~$ ./rsynctest.sh
Creating a 1 GB file in A...
Now press CTRL-C to interrupt rsync.
^Crsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(632) [sender=3.1.1]
tony@neo:~$ ls -la B/
total 8
drwxrwxr-x  2 tony tony 4096 Apr 15 20:10 .
drwxr-xr-x 20 tony tony 4096 Apr 15 20:09 ..
tony@neo:~$ ./rsynctest.sh
Creating a 1 GB file in A...
Now press CTRL-C to interrupt rsync.
^Crsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(632) [sender=3.1.1]
tony@neo:~$ ls -la B/
total 8
drwxrwxr-x  2 tony tony 4096 Apr 15 20:10 .
drwxr-xr-x 20 tony tony 4096 Apr 15 20:09 ..

相关内容