copyする

ファイルをディレクトリ単位でガツンとコピーしたいときのメモ。

今まではtarを使ってたんですが、ちょっと問題があるんですよね。 というのも昨今のBSDのファイルシステムでは「まばらなファイル」というのがあって、 これは、全部0x00の部分を記録しないという構造になっています。

具体的にこういうファイルを作るにはcreat(open)して1Tあたりまでseekして、1バイトwriteすればおk。

弊社は仕事柄DVDやBDのイメージファイルがたくさんあり、試験向けに1Tのファイルとかも あるんですがこれも実際のディスク上に占めるサイズはホンのチョビット(データは99.9%以上0x00なので)。

しかし、これをtarでコピーするとまじめに全部0x00で記録していくようで、HDDが何ペタあっても足りない。

これをなんとかしてくれる方法はないのかなーとソースを探ってたら cpioにて全部x00なら書かずに飛ばすという素的なオプションがあることが判明。

find . | cpio -p -adm --sparse /destination

こんな感じかな?

cpioってhard linkはちゃんと張ってくれるんでしたっけ?

コメント一覧

-l ちゃうか。
mya

Sparce fileっすね。find /hoge | cpio -pvduml --sparse /fuga あたりでどうでしょう。 afio も sparse をサポートしてた気がする。
jack

-lはつけなくてもhard linkされる模様。 たぶんi node見てるんでしょうね。 -lをつけると同じデバイスならcpじゃなくlnしようとするようです。なんで、違うデバイスでcpioすると warningうざすw あと、ディレクトリの日付が同じにならないよーな・・うーむ
Isami

さらに言うと cpioは(contrib/gnuの下にあるのでlinuxも同じ)、ポジションがlongになってるので i386では4G超えのファイルは使えないようです。 たまたまamd64のFreeBSDだったので、longが64ビットでよかった・・・
Isami

でも、cpio のオプション憶えられんのだわ。NetBSD的には、tarではなくcpio使え! らしいのだが。標準で付いてくる各種スクリプトやインストーラはtar使わずにcpioで、 tarも実体はcpioへのハードリンクだったりするのだが。manを見ると、POSIX的にも cpio使え!なんだそうだが。
kaz