split

split(UNIXやLinuxのコマンドで、ファイルをサイズや行数などで分割する)なんて
今更使わないよねぇ。。。とか思っていたら。


使う機会がありました。


400Mほどのファイルをネットワーク経由でscpしていたんですが、
相手先ホストから切られる。という状況で、

splitで20Mごと分割してscpしました。。。



昔はFDにファイルを格納するのにマルチボリューム対応のtar使ったり、
splitで分割したりと、そういうテクニックもありましたが、今時つかわねぇよな。と思っていたワケです。


そしたら、見事に使う機会が(^^;

coreserverからscpで400Mほどのtar.gzファイルのバックアップファイルの取得を行おうとしたが、途中で接続が切られるという状況になったので、
  • 小さいファイルでは問題無い(接続は切られない)
  • プロセスの実行時間がある程度経過するとプロセスがkillされる(coreserverの仕様)せいで、scpのリモートホスト側で起動するscpのプロセスがkillされている
という事を確認するため
まずファイルをsplitコマンドで
# split -b 10240000 hogehoge.tar.gz hogehoge.split.
hogehoge.split.aa hogehoge.split.ab hogehoge.split.ac hogehoge.split.ad・・・
とファイルを10M単位で分割した後で
# scp username@remotehost:/* ./
としてファイルを取得してみたが、やはり切断される。
ファイルを小さくしてもプロセスの実行時間がある一定時間以上で切られるという事が判ったので(=scpのプロセスも都度起動し直す必要がある)
  • プロセスの実行時間を短くすればよい
という事を考えた。
scpコマンドをファイル名の都度実行させれば、プロセスの実行開始〜終了までの時間(実行時間)は短くできると考えて
# for F in aa ab ac ad ae af ag ah ai aj ak al; do scp username@remotehost:/hogehoge.split.$F; done
と実行してみた。
結果、上手くファイルの転送が行えた。
受信したファイルは細切れの状態なので、これをcatでくっつける必要があるが
# cat hogehoge.split.aa hogehoge.split.ab ・・・・ > hogehoge.tar.gz
とやっていたのでは効率が悪いので、同じようにforを使い、
# for F in aa ab ac ad ae af ag ah ai aj ak al; do cat hogehoge.split.$F >> hogehoge.tar.gz; done
と実行した。
結果、上手く行ったかをファイルサイズとMD5チェックサムで確認した。


結果として上手く行ったけど、今更split使うなんて・・・思わなかった。

ちょっとLPICの試験問題覗いてみたけど、未だに過去の遺物のようなコマンド(tr, split, nlなど)の問題があって、ちょっとうんざりだったのだけど、こうして使う機会もあったという事で。