我在光学媒体上有几个大文件,我想复制到多个目标 - 在这种情况下,我有两个硬盘驱动器连接到同一台计算机。是否有一个实用程序可以像这样运行:
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 端口集合中可用,并且在无法直接使用的情况下易于编译)为此 - 只需替换cat为pv:
pv <inputfile> | tee <outfile1> <outfile2> > <outfile3>
Run Code Online (Sandbox Code Playgroud)
对于 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 文章中也讨论了这一点。