我想将一个目录及其所有内容移动到另一个目录之上。
我的意思是,如果我有两个目录 A 和 B,我想将 B 移动到 A,那么我希望将不在 A 中但在 B 中的文件和目录简单地复制到 A,将 A 中同名的文件更新为 B 中的副本,将 A 中同名的文件夹更新为来自 B 的新内容,但保留现有内容
有没有办法在 bash 中轻松地做到这一点?
顺便说一句,据我所知,当您提取 tar 存档覆盖该存档的旧版本时,就会发生这种情况。这是真的吗?
答案1
rsync -a -v -n /path/to/a/ /path/to/b/
如果一切正常,删除 -n 标志使其真正发挥作用。如果您不想让它太啰嗦,删除 -v 标志。
编辑:准确地说,这使得 b 拥有 a 拥有的一切,并且保留 b 之前拥有的一切。
答案2
你的方法是正确的tar
。这个命令会执行你想要的操作:
$ cd /path/to/A
$ tar -cf - * | tar -C /path/to/B -xf -
我也曾见过cpio
或rsync
使用过此目的。
以下是运行的示例tar
:
/tmp $ tree A B
A
|-- one
| `-- two
| |-- four
| `-- three
`-- uno
`-- hello
B
|-- dos
| |-- hi
| `-- tres
`-- one
`-- two
`-- three
7 directories, 5 files
/tmp $ md5sum A/one/two/three B/one/two/three
764efa883dda1e11db47671c4a3bbd9e A/one/two/three
d41d8cd98f00b204e9800998ecf8427e B/one/two/three
/tmp $ (cd A; tar -cf - * | tar -C ../B -xf -)
/tmp $ tree A B
A
|-- one
| `-- two
| |-- four
| `-- three
`-- uno
`-- hello
B
|-- dos
| |-- hi
| `-- tres
|-- one
| `-- two
| |-- four
| `-- three
`-- uno
`-- hello
8 directories, 7 files
/tmp $ md5sum A/one/two/three B/one/two/three
764efa883dda1e11db47671c4a3bbd9e A/one/two/three
764efa883dda1e11db47671c4a3bbd9e B/one/two/three
/tmp $
希望有帮助!