かまたま日記3

プログラミングメイン、たまに日常

xargsとddcpで高速にファイルをコピーする

総量350GBくらいの大量にファイルが入ってるディレクトリをコピーしないといけなくなったので、xargsとddcpを使って頑張ってコピーした時の記録

  • もっと簡単に出来る
  • もっといい方法がある

ご指摘お待ちしております!

#!/bin/bash

SRC_PATH=/foo
DST_PATH=/bar
PARALLELS=$(nproc)

find "${SRC_PATH}" -mindepth 1 -type d -printf "/%P\n" | xargs -P${PARALLELS} -n1 -I {} mkdir -p ${DST_PATH}{}
find "${SRC_PATH}" -type f -printf "/%P\n" | xargs -P${PARALLELS} -n1 -I {} /usr/local/bin/ddcp -s ${SRC_PATH}{} -d ${DST_PATH}{}

解説

  • ddcpはコピー先のディレクトリが無いとエラーになるので、最初のfindコマンドでSRC配下のディレクトリを見つけて先に作ります。
  • xargsの -P オプションでプロセッサの数だけ並列実行します -n1 のオプションで渡ってきた入力を一個ずつ後続のコマンドに渡します、 -I {} オプションで渡ってきた引数を {} で再利用することが出来ます。
  • ddcpは並列処理でcpを実行するので、ddcp自体を並列にする必要は無かったかも.. (要ベンチマーク)