从单一源到多个目标的并行文件复制?

从单一源到多个目标的并行文件复制?

我在光学介质上有几个大文件,我想将它们复制到多个目标 - 在这种情况下,我有两个硬盘连接到同一台计算机。是否有可以发挥以下功能的实用程序:

copy source target1 target2 ... targetN

答案1

对于单个文件,您可以tee将其复制到多个位置:

cat <inputfile> | tee <outfile1> <outfile2> > <outfile3>

或者如果你更喜欢 demoggified 版本:

tee <outfile1> <outfile2> > <outfile3> < <inputfile>

请注意,正如 Dennis 在注释中指出的那样,tee输出到stdout以及列出的文件,因此在上面的示例中使用重定向指向文件 3。您也可以将其重定向到如下所示 - 这样做的好处是使文件列表在命令行上保持更一致(这可能使编写可变数量文件的解决方案脚本变得更容易),但效率稍低(尽管效率差异很小:大约与使用版本或不带 的版本/dev/null之间的差异相同):catcat

cat <inputfile> | tee <outfile1> <outfile2> <outfile3> > /dev/null

您可能可以将上述方法之一与以下方法结合起来:find很容易地对一个目录中的多个文件进行操作,但不太容易对分布在目录结构中的文件进行操作。否则,您可能只需要将多个复制操作设置为并行的单独任务,并希望操作系统磁盘缓存足够明亮和/或足够大,以便每个并行任务都使用缓存的读取数据,而不是导致驱动器磁头抖动。

可用性:tee在标准 Linux 设置和其他 unix 或类 unix 系统上通常可用,通常作为 GNU“coreutils”包的一部分。如果您使用的是 Windows(您的问题未指定),那么您应该在各种 Windows 端口(如 Cygwin)中找到它。

进度信息:由于从光学介质复制大型文件可能需要一些时间(或通过慢速网络,或从本地快速介质复制更大的文件),进度信息可能很有用。在命令行上,我倾向于使用管道查看器(在大多数 Linux 发行版和许多 Windows 端口集合中可用,并且在无法直接使用的地方可以轻松地自行编译)为此 - 只需catpv这样替换:

pv <inputfile> | tee <outfile1> <outfile2> > <outfile3>

答案2

对于 Windows:

n2n复制将执行以下操作:

替代文本

对于 Linux:

cp命令本身可以从多个源复制,但不幸的是不能从多个目标复制。您需要在某种循环中多次运行它。您可以使用这样的循环并将所有目录名称放在一个文件中:

OLDIFS=$IFS
IFS=$'\n'

for line in $(cat file.txt):
do
   cp file $line
done

IFS=$OLDIFS

或者使用 xargs:

echo dir1 dir2 dir3 | xargs -n 1 cp file1

这两种方法都允许您复制整个目录/多个文件。StackOverflow 文章。

答案3

根据给出的答案类似的问题另一种方法是使用GNU 并行cp一次运行多个实例:

parallel -j 0 -N 1 cp file1 ::: Destination1 Destination2 Destination3

上述命令将同时将 file1 复制到所有三个目标文件夹

答案4

在 bash (Linux、Mac 或 Cygwin) 中:

cat source | tee target1 target2 >targetN

(tee 将其输入复制到 STDOUT,因此在最后一个目标上使用重定向)。

在 Windows 中,Cygwin 通常是多余的。相反,你可以从Unx工具类项目,其中包括 cat、tee 和许多其他。

相关内容