我想更新一些论坛软件,并且想使用 CLI 测试升级过程作为学习可能性。
如何将一个文件夹的内容合并到另一个文件夹并替换文件?
答案1
您可以使用rsync
以下方法来执行此操作:
$ rsync -abviuzP src/ dest/
-a
存档模式;等于 -rlptgoD(无 -H、-A、-X)-i
打开逐项格式,显示比默认格式更多的信息-b
使 rsync 备份两个文件夹中都存在的文件,并将 ~ 附加到旧文件中。您可以使用 --suffix .suf 控制此后缀-u
使 rsync 传输跳过 dest 中比 src 中更新的文件-z
打开压缩,这在通过慢速链接传输易于压缩的文件时非常有用-P
打开 --partial 和 --progress--partial
如果传输中断,则使 rsync 保留部分传输的文件--progress
显示每次传输的进度条,如果您传输大文件,则很有用
我会放弃其中几个开关,但这只是为了让您开始。我可能会使用这样的东西:
$ rsync -abuP src/ dest/
一旦看起来正常,您可以运行以下命令来删除备份文件:
$ find dest/ -name "*.~" -delete
例子
假设我们有以下示例数据。
原始数据
我们将使用以下命令来制造一些虚假数据。
$ seq 10 | xargs -I{} -- mkdir dest/dir{}
$ for i in $(seq 5); do echo "$i" > dest/dir$i/file$i;done
假数据如下:
$ tree -DsifvF --noreport dest/
dest
[ 4096 Aug 29 22:21] dest/dir1/
[ 2 Aug 29 22:21] dest/dir1/file1
[ 4096 Aug 29 22:21] dest/dir2/
[ 2 Aug 29 22:21] dest/dir2/file2
[ 4096 Aug 29 22:21] dest/dir3/
[ 2 Aug 29 22:21] dest/dir3/file3
[ 4096 Aug 29 22:21] dest/dir4/
[ 2 Aug 29 22:21] dest/dir4/file4
[ 4096 Aug 29 22:21] dest/dir5/
[ 2 Aug 29 22:21] dest/dir5/file5
新数据
现在我们将复制原始数据 ( dest/*
-> src/
) 并添加几个较新的文件。这模拟了“新版本”。
$ cp -pr dest/* src/
$ mkdir src/dir11
$ for i in 1 3 5 11; do echo "$i$i" > src/dir$i/file$i;done
假数据如下:
$ tree -DsifvF --noreport src/
src
[ 4096 Aug 29 22:21] src/dir1/
[ 3 Aug 29 23:00] src/dir1/file1
[ 4096 Aug 29 22:21] src/dir2/
[ 2 Aug 29 22:21] src/dir2/file2
[ 4096 Aug 29 22:21] src/dir3/
[ 3 Aug 29 23:00] src/dir3/file3
[ 4096 Aug 29 22:21] src/dir4/
[ 2 Aug 29 22:21] src/dir4/file4
[ 4096 Aug 29 22:21] src/dir5/
[ 3 Aug 29 23:00] src/dir5/file5
[ 4096 Aug 29 23:00] src/dir11/
[ 5 Aug 29 23:00] src/dir11/file11
将 src/ 合并到 dest/
这模仿了我们刚刚设置新的软件树src/
并想要合并到我们预先存在的目录dest/
.
$ rsync -abuP src/ dest/
sending incremental file list
dir1/file1
3 100% 0.00kB/s 0:00:00 (xfer#1, to-check=5/13)
dir11/
dir11/file11
5 100% 4.88kB/s 0:00:00 (xfer#2, to-check=4/13)
dir3/file3
3 100% 2.93kB/s 0:00:00 (xfer#3, to-check=2/13)
dir5/file5
3 100% 2.93kB/s 0:00:00 (xfer#4, to-check=0/13)
sent 416 bytes received 97 bytes 1026.00 bytes/sec
total size is 18 speedup is 0.04
如您所见,以下文件已更新:file1、file3、file5 以及新添加的 dir11 + file11。
作为确认,我们可以看到以下备份文件是在rsync
遇到dest/
.
$ find dest/ | grep "~"
dest/dir3/file3~
dest/dir1/file1~
dest/dir5/file5~
答案2
您可以使用 cp -r name_of_the_folder/* name_of_the_destination_folder,其中星号 (*) 代表所有文件,-r 代表递归复制。
您还可以使用 -i 选项,它会询问您是否要覆盖内容。