パイプとxargsを使用して大容量ファイルを圧縮することはできません。

パイプとxargsを使用して大容量ファイルを圧縮することはできません。

次のようにmysqlバックアップファイルをパッケージ化しようとしています。

find /data/mysqldata \( ! -name "*mysql-bin*" -a ! -name "*.log" \) |
    xargs tar -zcf /data/backup.tgz

実際にこのコマンドをPopenで実行し、select-poll方式で出力が読み込まれるのを待っていましたが、tarプログラムを再起動したかのようにバックアップファイルが大きくなりすぎて、突然小さすぎる場合がありました。これは通常、ターゲットファイルが非常に大きく混乱している場合に発生します。

答え1

GNUの使用tar:

tar -cz -f /data/backup.tgz --exclude '*.log' --exclude 'mysql-bin.*' /data/mysqldata 

あなたが経験している問題は、xargsそれをtar複数回(少なくとも2回)実行することです。バックアップファイルは、2回目の実行時にtar「縮小」(上書き)されます。

それがまさにそのことですxargs。できるだけ多くの引数を使用してユーティリティを実行し、より多くの引数(あなたのファイル名)を取得したら、リストを切り取り、ユーティリティへの他の呼び出しでリストを引き続き使用します。

質問起こったすべてのディレクトリとファイル名をに送信するため、xargs非常に長いリストが生成されます。

答え2

xargs(場合によっては)リストを複数のアーカイバー呼び出しに分割するのではなく、ファイルリストをarchiveコマンドに直接パイプします。

ここでは標準コマンドを使用しますが、pax一部のコマンドは安定性を向上させるために非標準拡張を-print0サポートしています。-0

find /data/mysqldata ! -name "*mysql-bin*" ! -name "*.log" -print0 |
  pax -0wd | gzip > file.tar.gz

-dこれを使用しないと、すべてのファイルが含まれます。アーカイブ(除外パターンと一致しない)は、メソッドのようにすべてを/data/mysqldataアーカイブtarすることを意味するためです。)

これに加えて、pax多くのtar実装が標準入力からファイルリストを取得することをサポートしていますが、実装間でインタフェースが異なることがよくあります。

関連情報