在 Unix 上执行并行复制的最佳方法是什么?

dsg*_*dsg 22 unix threads parallel-processing

我通常必须将网络文件系统上文件夹的内容复制到本地计算机。远程文件夹中有许多文件(1000 个)都相对较小,但由于网络开销,常规副本cp remote_folder/* ~/local_folder/需要很长时间(10 分钟)。

我相信这是因为文件是按顺序复制的——在复制开始之前,每个文件都会等待前一个文件完成。

提高这个副本速度的最简单方法是什么?(我假设它是并行执行复制。)

在复制之前压缩文件不一定会加快速度,因为它们可能都保存在不同服务器的不同磁盘上。

Ole*_*nge 15

如果你安装了 GNU Parallel http://www.gnu.org/software/parallel/你可以这样做:

parallel -j10 cp {} destdir/ ::: *
Run Code Online (Sandbox Code Playgroud)

您可以简单地通过以下方式安装 GNU Parallel:

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 883c667e01eed62f975ad28b6d50e22a
12345678 883c667e 01eed62f 975ad28b 6d50e22a
$ md5sum install.sh | grep cc21b4c943fd03e93ae1ae49e28573c0
cc21b4c9 43fd03e9 3ae1ae49 e28573c0
$ sha512sum install.sh | grep da012ec113b49a54e705f86d51e784ebced224fdf
79945d9d 250b42a4 2067bb00 99da012e c113b49a 54e705f8 6d51e784 ebced224
fdff3f52 ca588d64 e75f6033 61bd543f d631f592 2f87ceb2 ab034149 6df84a35
$ bash install.sh
Run Code Online (Sandbox Code Playgroud)

命令、参数和选项的说明

  • 平行——相当明显;调用并行命令
    • 从标准输入并行构建和执行 shell 命令行 - man deeplink
  • -j10 ------- 并行运行 10 个作业
    • 每台机器上的作业槽数。最多并行运行 N 个作业。0 表示尽可能多。默认值为 100%,这将在每台机器上的每个 CPU 运行一个作业。-男人深层链接
  • cp -------- 并行运行的命令
  • {} --------- 在此处替换接收到的值。即source_file命令的参数cp
    • 此替换字符串将被从输入源读取的整行替换。输入源通常是 stdin(标准输入),但也可以用 -a、:::: 或 :::: 给出。可以使用 -I 更改替换字符串 {}。如果命令行不包含替换字符串,则 {} 将附加到命令行。-男人深层链接
  • destdir/ - 目标目录
  • ::: -------- 告诉并行使用下一个参数作为输入而不是标准输入
    • 使用命令行中的参数作为输入源而不是 stdin(标准输入)。与 GNU 并行 ::: 的其他选项不同,它位于命令之后和参数之前。-男人深层链接
  • * ---------- 当前目录下的所有文件

了解更多

您的命令行会因此而爱您。

查看更多示例:http : //www.gnu.org/software/parallel/man.html

观看介绍视频:https : //www.youtube.com/playlist? list =PL284C9FF2488BC6D1

演练教程:http : //www.gnu.org/software/parallel/parallel_tutorial.html

http://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html获取“GNU Parallel 2018”一书 或从以下 网址下载:https : //doi.org /10.5281/zenodo.1146014至少阅读第 1+2 章。您应该花不到 20 分钟的时间。

打印备忘单:https : //www.gnu.org/software/parallel/parallel_cheat.pdf

注册电子邮件列表以获得支持:https : //lists.gnu.org/mailman/listinfo/parallel

  • 可以通过解释命令并在可能的情况下使用长选项来改进此答案。例如,`:::` 是做什么的,`{}` 是做什么的。`-j10` 可以做成 `--jobs 10` 等。 (2认同)

Old*_*olf 8

只要您限制正在运行的复制命令,您就可以使用像Scrutinizer发布的脚本一样的脚本

SOURCEDIR="$1"
TARGETDIR="$2"
MAX_PARALLEL=4
nroffiles=$(ls "$SOURCEDIR" | wc -w)
setsize=$(( nroffiles/MAX_PARALLEL + 1 ))
ls -1 "$SOURCEDIR"/* | xargs -n "$setsize" | while read workset; do
  cp -p "$workset" "$TARGETDIR" &
done
wait
Run Code Online (Sandbox Code Playgroud)

  • @dsg:`cp` 命令末尾的`&` 允许`while` 循环继续并开始下一个cp 命令而无需等待。`xargs` 命令将文件名以 4 个为一组(MAX_PARALLEL)传递给 `while` 循环。 (3认同)
  • 但请注意警告:**此脚本中断**,文件名包含空格或通配符。 (2认同)

小智 7

老实说,最好的工具是 Google 的 gsutil。它通过目录递归处理并行副本。我见过的大多数其他方法都无法处理目录递归。他们没有在文档中特别提到本地文件系统到本地文件系统副本,但它的工作原理就像一个魅力。

这是另一个要安装的二进制文件,但考虑到当今所有云服务的采用,您可能已经运行了它。