首先,我在下面详细给出我的目录结构。
src
1
1_1.txt
test_line1
1_2.txt
test_line1
2
2_1.txt
test_line1
2_2.txt
test_line1
我将此src
目录与dst
目录同步。所以现在目录与使用以下命令的目录dst
相同。src
rsync
rsync -av src/* dst/
出色地。如果我在目录中现有的任何文件中添加一行src
,则相同的命令会复制该目录中的更改dst
。
1_2.txt
现在我在目录中添加额外的文本行dst
。在这种情况下,src
和dst
目录不相同。
如果我运行上面的rsync
命令,我认为它会从目录中的该文件中删除多余的行dst
。但它没有发生。
src
我应该怎么做才能保持文件与目录相同dst
?当手动在目录中添加新目录/文件时
dst
,运行命令时应该提示是否删除该目录/文件rsync
。我怎样才能做到这一点?
答案1
我无法重现您所看到的相同行为:
$ tree
.
|-- d
| `-- file
`-- s
`-- file
2 directories, 2 files
$ cat s/file
hello
$ rsync -av s/ d
sending incremental file list
sent 63 bytes received 12 bytes 150.00 bytes/sec
total size is 6 speedup is 0.08
没有传输数据,两个文件已经相同。
$ echo world >>d/file
$ cat d/file
hello
world
$ rsync -av s/ d
sending incremental file list
file
sent 116 bytes received 35 bytes 302.00 bytes/sec
total size is 6 speedup is 0.04
$ cat d/file
hello
这表明添加到目标目录中文件的行将通过重新运行而被删除rsync -a
。
要删除目标中源目录中不可用的文件,请使用--delete
:
$ tree
.
|-- d
| |-- extra_file
| `-- file
`-- s
`-- file
2 directories, 3 files
$ rsync -av --delete s/ d
sending incremental file list
deleting extra_file
./
sent 66 bytes received 29 bytes 190.00 bytes/sec
total size is 6 speedup is 0.06
$ tree
.
|-- d
| `-- file
`-- s
`-- file
2 directories, 2 files
该rsync
实用程序本身不支持在删除目标上的文件之前进行交互式确认提示。不过,您可以先运行--dry-run
一下,看看如果您真正运行副本会发生什么。
另请注意,如果您使用rsync -av s/* d
而不是rsync -av s/ d
,那么您将不会复制源目录中的任何隐藏文件或目录。这是因为*
默认情况下 glob 模式不会扩展到隐藏文件名。但源目录子目录中的隐藏文件仍会被复制。