如何复制带有保留硬链接的目录?

Grz*_*cki 45 hard-link cp files

如何将具有共同文件的目录从一个分区移动到另一个分区?

让我们假设我们已经挂载了/mnt/X带有硬链接共享文件的目录的分区。如何将这些目录移动到另一个分区,让它/mnt/Y保留那些硬链接。

为了更好地说明“与硬链接共享文件的目录”是什么意思,这里是一个例子:

# let's create three of directories and files
mkdir -p a/{b,c,d}/{x,y,z}
touch a/{b,c,d}/{x,y,z}/f{1,2,3,4,5}
# and copy it with hardlinks
cp -r -l a hardlinks_of_a
Run Code Online (Sandbox Code Playgroud)

更具体地说,假设文件的总大小为 10G,每个文件有 10 个硬链接。问题是如何使用 10G 将它移动到目的地(有人可能会说用 100G 复制它然后运行重复数据删除 - 这不是我要问的)

cas*_*cas 41

rsync 有一个-Hor--hard-links选项,并且具有通常的 rsync 优点,可以停止和重新启动,并重新运行以有效处理在上次运行期间/之后更改的任何文件。

-H, --hard-links
    This tells rsync to look for hard-linked files in
    the source and link together the corresponding
    files on the destination.  Without  this option,
    hard-linked files in the source are treated as
    though they were separate files. [...]
Run Code Online (Sandbox Code Playgroud)

阅读rsync手册页并搜索 -H。那里有更多关于特定警告的详细信息。

  • 我已经检查过 - 它有效。 (2认同)
  • 来自`man rsync`:*从rsync 3.0.0 开始,现在使用的递归算法是增量扫描,它使用的内存比以前少得多,并在完成前几个目录的扫描后开始传输。这种增量扫描只影响我们的递归算法,不会改变非递归传输。也只有在传输的两端都至少是 3.0.0 版本时才有可能。* 请注意,`--delete-before` 和 `--delete-after` 都禁用了这种改进算法。 (2认同)

Ala*_*rry 32

第一个答案:GNU方式

GNU 以cp -a递归方式复制,尽可能多地保留结构和元数据。源目录中文件之间的硬链接包含在其中。要特别选择硬链接保留而不具有所有其他功能-a,请使用--preserve=links.

mkdir src
cd src
mkdir -p a/{b,c,d}/{x,y,z}
touch a/{b,c,d}/{x,y,z}/f{1,2,3,4,5}
cp -r -l a hardlinks_of_a
cd ..
cp -a src dst
Run Code Online (Sandbox Code Playgroud)

  • @Hugo:将特定于 GNU 的 args 用于标准工具并没有错。GNU 版本现在是事实上的标准,即使没有预装它们,安装 GNU 工具也是常见的做法(我知道我一直这样做 - 它们比例如 solaris 和 *bsd 版本更好,并且它们提供了不同 *nixes 之间的一致性)。在您使用 GNUism 时指出它们可能是一种很好的做法,但不是必需的。Grzegorz 也没有说“不在 linux 上”,因此可以合理地假设这就是他所谈论的环境。 (6认同)
  • +1 在 tar 上,-1 用于为 cp 使用 gnu 特定的参数。 (3认同)

Ala*_*rry 17

第三个答案:POSIX方式

POSIX 尚未标准化该tar实用程序,尽管他们已标准化了tar存档格式。用于操作 tar 存档的 POSIX 实用程序被调用pax,它具有能够在单个进程中执行打包和解包操作的额外功能。

mkdir dst
pax -rw src dst
Run Code Online (Sandbox Code Playgroud)


Ala*_*rry 13

第二个答案:古老的 UNIX 方式

在源目录中创建一个 tar 存档,通过管道发送它,然后在目标目录中解压它。

# create src as before
(cd src;tar cf - .) | (mkdir dst;cd dst;tar xf -)
Run Code Online (Sandbox Code Playgroud)


Pyk*_*ler 10

来源:http : //www.cyberciti.biz/faq/linux-unix-apple-osx-bsd-rsync-copy-hard-links/

制作精确副本所需的是

rsync -az -H --delete --numeric-ids /path/to/source/ /path/to/dest/
Run Code Online (Sandbox Code Playgroud)

  • 我怀疑这不会复制 ACL、扩展属性等。Linux 版本也有 -A 和 -X 选项来保留这些,但我认为你在 MacOS 上运气不好。 (2认同)