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

Goy*_*uix 17 file-transfer

我在光学媒体上有几个大文件,我想复制到多个目标 - 在这种情况下,我有两个硬盘驱动器连接到同一台计算机。是否有一个实用程序可以像这样运行:

copy source target1 target2 ... targetN
Run Code Online (Sandbox Code Playgroud)

Dav*_*ett 26

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

cat <inputfile> | tee <outfile1> <outfile2> > <outfile3>
Run Code Online (Sandbox Code Playgroud)

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

tee <outfile1> <outfile2> > <outfile3> < <inputfile>
Run Code Online (Sandbox Code Playgroud)

请注意,正如 Dennis 在注释中指出的tee输出stdout以及列出的文件,因此在上述示例中使用重定向指向文件 3。您也可以将其重定向到/dev/null如下所示 - 这具有在命令行上保持文件列表更加一致的优点(这可能使为可变数量的文件编写解决方案更容易)但效率稍低(尽管效率差异小:与使用cat版本或不使用版本的差异大致相同cat

cat <inputfile> | tee <outfile1> <outfile2> <outfile3> > /dev/null
Run Code Online (Sandbox Code Playgroud)

您可能可以find很容易地将上述之一与对一个目录中的多个文件进行操作相结合,而对分布在目录结构中的文件进行操作则不太容易。否则,您可能只需要将多个复制操作作为单独的任务并行关闭,并希望 OS 磁盘缓存足够亮和/或足够大,以便每个并行任务使用第一个缓存的读取数据,而不是导致驱动器磁头颠簸。

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

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

pv <inputfile> | tee <outfile1> <outfile2> > <outfile3>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`tee` 也将输出到 stdout,因此您可能想要执行 `tee outputfile1 outputfile2 &lt; inputfile &gt; /dev/null`,因为将二进制文件输出到终端可能会产生噪音并弄乱其设置。 (5认同)

Joh*_*n T 5

对于 Windows:

n2ncopy会这样做:

替代文字

对于 Linux:

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

OLDIFS=$IFS
IFS=$'\n'

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

IFS=$OLDIFS
Run Code Online (Sandbox Code Playgroud)

或使用 xargs:

echo dir1 dir2 dir3 | xargs -n 1 cp file1
Run Code Online (Sandbox Code Playgroud)

这两者都允许您复制整个目录/多个文件。此StackOverflow 文章中也讨论了这一点