pvを介したディレクトリコピーの進捗情報


13

非常に大きなディレクトリ(ここではテラバイト単位)をコピーし、進行状況を監視する必要があります。

これpvは便利なユーティリティであることがわかりましたが、ディレクトリを再帰的にコピーするためにどのように使用できますか?(pv src > dstディレクトリであるため機能しません)

PS:pvMac PortsからインストールされたOS X Mountain Lionで実行

回答:


21

使用する rsync --progress [SRC] [DST]

man rsync非常に便利なオプションがたくさんあるので、ページを確認してください。-aアーカイブのための良いスタートですが、それはあなたの正確な要件に依存します。

パイプを介したコピーは、特にファイルベースの場合、コピープロセスを不必要に遅くします。


パイプを介してコピーするとプロセスが遅くなるのはなぜですか?パイプによって提供されるバッファリングとパイプに関連付けられたマルチタスクは、私が言う問題を解決する可能性が高いです。(およびrsyncはマルチプロセスであり、IIRC内部でパイプを使用します)。ファイルベースではないコピープロセスとは何ですか?
ステファンシャゼル

Bashは便利ですが、高速ではありません。特に、あるコマンドを別のコマンドにパイプする場合。
ジッピー

@StephaneChazelas:パイプのバッファは8KBしかないためです。rsyncのようなプログラムは、はるかに大きな内部バッファーを使用する場合があります。
ザンリンクス

10

あなたは使うことができtarたりpaxまたはcpio

mkdir -p dst &&
  (cd src && tar cf - .) | pv -trb | (cd dst && tar xpf -)

1
さらに、コマンドにa vを追加してtar、ファイル名を表示できます。
ペテルフ14年

コピーを実行する前にソースフォルダーを圧縮しますか?私のフォルダのサイズは5 TBなので、これが最適な方法かどうかわかりません。pvを使用すると、進捗状況が非常に良好であるため、アドバイスをお願いします。
タック

@Tak、いいえ。圧縮がないため、何も圧縮されません。tar cf -ファイルとそのメタデータを含むストリームを出力します。これはパイプを介してpvに送られtar、進行状況の表示中に他のファイルにそのまま送られ、もう一方tarはそのストリームのデータを抽出します。3つのコマンドはすべて同時に実行され、データを処理します。ディスクには何も保存されず、パイプバッファーとコマンド内部バッファー以外のメモリには何も保存されません。
ステファンシャゼラス

@StéphaneChazelasコメントありがとうございます。私はそれを試してみましたが、動作しているのは、プログレスバーに左から右への割合が表示されないことだけです。理由は何ですか?このパラメーターでpvを使用しました-petraは、通常、進行状況バーを表示します。私もあなたの答えを支持しました。

@Tak、pv転送するデータ量を知る方法はありません。あなたはその金額の見積もりを持っている場合は、あなたがそれにそれを渡すことができます-sオプション(GNUがdu -sb srcファイルが十分な大きさであれば、あなたに良い近似を与えるだろう)
ステファンChazelas

2

タール。

tar -cf - /var/log/ | pv | tar -C . -x

例:

# tar -cf - /var/log/ | pv | tar -C . -x
tar: Removing leading `/' from member names
58MB 0:00:05 [ 2.2MB/s] [                   <=> 

1

以下に、進行状況情報を含むディレクトリをコピーするコマンドをいくつか示します。


小さなファイルが多数ある場合:

cp -av sourcedir targetdir | pv -l -s filecount > logfile

これにより、コピーされたファイルの数に基づいて進行状況が報告されます。

/dev/null必要がなければリダイレクトできますlogfile

取得するには、次のコマンドを使用しますfilecount

find sourcedir | wc -l

巨大なファイルが少ない場合:

tar c sourcedir | pv -s size | tar x -C targetdir

これは、コピーされたバイトに基づいて進行状況を報告します。

targetdir 存在する必要があります。

取得するには、次のコマンドを使用しますsize

du -sh sourcedir

rsyncを使用する場合:

rsync -ai sourcedir/ targetdir/ | pv -l -s filecount > logfile

filecount上記のように取得します。

同じシステムでコピーする場合、rsync -a実質的にはと同じcp -aです。rsyncの利点は、ネットワーク経由でコピーする場合、または以前のコピーを更新(または比較)する場合です。

詳細はこちらをご覧ください:


0

du -b /directory/通常のコピーコマンドの実行中にソースとデスティネーションの両方でa を実行し、2つを比較できます。これは同じくらい効果的であり、コピープロセスをパイプに通すことでコピープロセスを遅くすることはありません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.