パソコン・メモメモ備忘録

気の向くままパソコン関係等で気になることを書き記す。時々更新!

大量のファイルをリモートコピーしたい場合 tar + ssh

ある CentOS な PC 上にある大量のファイル数十万個を別の PC へネットワーク経由でコピー(バックアップ)する必要があった。普通に tar cfvz - A* | ssh XXX@YYY.ZZZ 'cat > aaa.tar.gz' みたいにしようとしたのだが、Argument list too long というエラーが出てダメだった。フォルダの中身全部を送るならそれはフォルダまるごと指定すればいいだけの話だが、そのなかで、例えば A から始まる名前のファイルだけ、という事がしたかった。

このエラーメッセージでググってみると、xargs を使え、というページがあった(猫山工房 さんの記事)。しかしながら、これはローカルの tar ファイルへ蓄積する場合は使えるが、パイプと ssh を使ってリモートの PC で tar ファイルを固める場合には使えなかった。残念。

色々調べてみると、sshfs というのがあって、ssh 経由でリモートのディスクをマウントできる、とのこと。コピー元の方はサーバなので、なんとなく不要なものをインストールしたくなく、コピー先の方に sshfs 関係をインストールして、コピー元をマウントしてみることにした。これがまた、素直に sshfs がインストールできず、手間がかかった。まず、rpmforge を yum のレポジトリの一つとして登録する必要がある。

ckme.co.jp さんのページ を参考に進めようとしたが、RPM-GPG-KEY.dag.txtインポート読み込みがうまくいかない。まぁ、先人はいるもので、対処法があった(俺のひとり言 さんの記事)。ということで、うまくマウントはできた。が、ここでふと気がついた。最初の tar と ssh をパイプで繋ぐ場合は、一応 gzip 圧縮がかかった状態でネットワークを流れる。HDD のアクセス速度と比べるとネットワークがやはりネックだ(インターネット経由なんで)。リモートの大量のファイルをマウントして、それをローカルの tar ファイルに固めると、圧縮がかからない状態のものがネットワークを流れる事になり、時間的、ネットワーク帯域的にもったいない気がした。

そこでまた、別の手段が無いか探してみた。「檜山正幸のキマイラ飼育記」さんの記事にぴったりなものがあった。ポイントは tar の -T オプションを使う事。

find -name "A*" | tar czO -T - | ssh XXX@YYY.ZZZ 'cat > aaa.tar.gz'

これで OK。シンプル、かつ美しい。おっと、実際は、コピー元からコピー先へは ssh でログイン出来ない環境だった。逆は可能なので、

ssh XXX@YYY.ZZZ 'cd ttttt; find -name "A*" | tar czO -T -' > aaa.tar.gz

かな。

こういうやり方を調べて見つけるのはなかなか難しいものだ。