使用CLI合并文件夹并替换文件


9

我想更新一些论坛软件,并希望使用CLI测试升级过程,以此作为学习的可能性。

如何将一个文件夹的内容合并到另一个文件夹并替换文件?

Answers:


10

您可以使用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~

为了澄清以上几点:一旦看起来确定,就可以运行以下命令来删除备份文件:> $ find dest / -name“ start dot〜” -delete这对我似乎不起作用,而:> $找到dest / -name“开始点星〜” -delete做。不知道这是拼写错误还是我未设定正确的设置!

2

可以使用cp -r name_of_the_folder / * name_of_the_destination_folder,其中星号(*)代表所有文件,而-r代表递归副本。

您还可以使用-i选项,该选项将询问您是否要覆盖内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.