find + cpio でほしいファイルだけツリー構造を保持して取り出す

昨日ハマったので別解を探す。rsync の include, exclude には頼らずに必要なファイルだけのツリーを作るというところまでは同じなんだけど、ファイル群が巨大すぎて全体のコピーなんてやってられませんという場合には必要なファイルだけを取り出す作業が必要になる。

[2007-06-07 追記]

以前 tar 方式を試したが予想通りファイルが多すぎたらダメになったので、ちゃんと cpio について調べた。そしたら以下のように超簡単に書けることが分かった。

find PATH \( EXPRESSION \) -a print0 | cpio -p0d DEST

find の -print0 は書いた瞬間に true が返ってしまい、すべてのファイルが対象になってしまうので最後に書く。

cpio の -0 オプションは GNU cpio じゃないと使えないですね…。BSD だと pax の -s \0 とかで代用できるのかな?


※ こっから下はエントリの日付通りの日に試したみた結果。案の上 tar -cf ではファイルの数が多すぎたときに途中でアーカイブがクリアされてしまう。

一カ所にコピーしたいんじゃなくて階層も保持したいのでとりあえず tar に突っ込む方式にした。つーことはこんな感じか。

find PATH EXPRESSION | xargs tar -cf ARCHIVE

実際にはアーカイブを作成せずに一気に別な場所にコピーすることも可能だが、まぁそれは次の段階ということで。ファイルの数が多すぎると -c で作っているんで問題が起きるような気がする1んだけど、そこら辺をどうやって回避したらいいかまでは考えてないです。(最初にアーカイブを空っぽで作成して append していかなくていいのか?とか)

なんか最初無理に複雑にして BSD と GNU/Linux の違いにハマっていきましたが、実は単純でした。ありがとう > 隣の席の人

  1. xargs から tar が複数回に分けて呼び出されるとまずいってこと。 

More