4億のファイルを含むディレクトリがあります。 findを使用して、次のすべてのファイルのリストを作成しました。
/output/custom/31/7/31767937
/output/custom/31/7/317537a
/output/custom/31/7/317537
/output/custom/31/7/317ab
/output/custom/31/7/317bo
/output/custom/31/7/317je
/output/custom/31/7/317ma
/output/custom/31/7/31763
次に、ファイルを20の異なるファイルに分割し、スクリプトを実行して20の異なるタールボールを作成しました。
for i in $(ls x*)
do
tar -cf /tar/$i.tar -T $i &
done
入力ファイルは/tar
マウントポイントとは異なるドライブにあります。スクリプトは現在2日間実行され、約4分の1完了しました。おそらく今はまだ実行状態にしておくでしょう。しかし、後で参照できるようにtar
?を使用するよりも良い方法があるかどうか疑問に思います。
私の究極の目標は、このタールボールを20の異なるサーバーに移動し、解凍し、ファイルに対していくつかのスクリプトを実行することです。あ、もうタルボールができたのでS3リポジトリにも入れてみましょう。
答え1
移動のしやすさの面ではをお勧めしますrsync
。
利点
- すべてを実行する1つのコマンド、すべてを見つける1つのコマンド
- 転送中にネットワークが切断された場合に再起動可能
- 作業量が少ない。分割/タールしてから転送/圧縮解除する必要はありません。
- ソースサーバーはファイルの読み取りに集中し、ターゲットサーバーに書き込みを処理させることができます(メタデータの更新などの潜在的なファイルシステムIOの競合が軽減されます)。
欠点
- あなたはこれまでのすべての努力を放棄しました
- 考慮したソリューションとは異なります。
- 2つのシステム間の直接接続が必要です(実際にはありませんが、SSHトンネルを提供する必要があります)。
提案されたソリューション
ディレクトリツリーのすべてのファイル
cd /path/to/top/source/directory rsync -avPR -e ssh . remoteuser@remotehost:/path/to/top/destination/directory
ファイルにリストされたファイル名
cd /path/to/top/source/directory rsync -avPR -e ssh --files-from=/path/to/filelist . remoteuser@remotehost:/path/to/top/destination/directory
2番目の回避策では、ファイルリストファイルから取得したファイル名がターゲットファイルシステムにも適用されるため、ソースディレクトリの上部にファイル名を一覧表示する必要があります。
これらのタスクをrootとして実行する場合は、rootssh
としてログインできるように、ソースサーバーからターゲットサーバーに証明書をコピーする必要があることがほとんどあります。