Linux中的命令行递归/深层目录复制?


13

在大多数情况下,在Linux中制作递归/深层目录副本的最佳通用方法是什么?我用过一些简单的东西,例如cp -R精心制作的cpio咒语。是否有任何明显的优点或缺点使您偏爱另一种?您最常使用哪一个?

Answers:


29
NAME
cp - copy files and directories

-a, --archive
   same as -dpR

-d     same as --no-dereference --preserve=links
-p     same as --preserve=mode,ownership,timestamps
-R, -r, --recursive
    copy directories recursively

因此,在回答您的问题时:

cp -a /foo /bar

将所有内容从目录/ foo递归复制到目录/ bar,同时保留符号链接和文件/目录“模式”,“所有权”和“时间戳”。


这无疑是一个非常简单明了的解决方案。您是否发现此方法有任何缺点?分布式文件系统?副本数量过多?在某些情况下,您是否发现其他解决方案(如cpio,tar或rsync)更有效?
格雷格·马特斯

1
除非有物理错误,否则我从内存到任何本地安装的地方(无论NFS或Samba安装如何)都不会发生本地“ cp”故障(我只做过TB大小的传输)。在rsync手册页下签出“ USAGE”,以获取有启发性的示例。我最喜欢的:$ rsync --partial --progress --rsh = ssh --archive --verbose --compress foo / user @ hosname:〜/ bar(rsync -avzP)
Gareth

如上所述,-a并非严格可移植。
马修·弗拉申

好吧,我知道busybox,GNU和BSD cp都可以。除了传统的Unix机器外,我还从未见过这种解决方案无法解决的问题?尽管我完全理解Zoredache的观点:“它似乎总是能正确完成工作,所以我从来没有真正想过找到替代者。”
加雷斯

@gyaresu请考虑将您的第二条评论分成另一个答案,以便我们对其进行投票。
格雷格·马特斯

6

我经常使用“ cd $ srcdir; tar -c。| tar -C $ destdir -x”这样的命令。但是我也使用rsync -a $ src $ dst。

tar解决方案的最大优势在于,这是我很多年前在没有cpio,rsync或递归复制的cp的系统上使用的。焦油几乎无处不在。它被挂在我的头上,因为我经常使用它,可能还有更多优雅的方法。似乎总是可以正确地完成工作,所以我从来没有真正想过找到一个替代者。


我非常喜欢“焦油无处不在”的说法。我出于类似的原因也精通vi,尽管我更喜欢其他编辑环境。
格雷格·马特斯

-R早已成为标准(opengroup.org/onlinepubs/009695399/utilities/cp.html)的一部分,尽管不是-a。
马修·弗拉申

@Matthew Flaschen:您的评论是针对@gyaresu的回答吗?
格雷格·马特斯

这也与此相关,因为Zoredache说他遇到了一个“没有一个可以递归复制的cp的系统”。基本上,-R->可移植,-a->不可移植。
马修·弗拉申

1
大约在95年前,系统运行的是80年代后期的Unix版本。我不认为-R是cp的选项,但我不确定。我了解了阅读Usenet的花絮。
Zoredache

6

看一下rsync ...我喜欢它,因为当保持两个目录最新时,您复制的数据更少...它也可以远程工作。最简单的形式rsync -a / src / dest


这是一个很好的观点。本质上,rsync具有计算“目录差异”的能力,并且仅传输同步目录所需的内容。因此,您可以反复调用rsync -a src / dest之类的东西来递归“连续复制”目录(正确同步需要src上的尾随/),而cp -a src / dest则不能那样工作。cp命令将在第一个cp之后在dest中创建一个新的src目录。您需要类似cp -au src / * dest的后续副本。
格雷格·马特斯

我喜欢rsync的另一个原因是您可以将-P标志传递给它,该标志显示进度条。它使您了解某些内容将花费多长时间
Rory

0

rsync是一个很棒的工具。它是传输数据的瑞士军刀。这是一个简单而强大的工具。一旦开始使用它,您就会上瘾。

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.