-
findの結果をtarでアーカイブしたい
Posted on 1月 15th, 2013 はおりん No comments正解はコレ
find -name "hoge*" -print0 | tar -cvz -T - --null -f hoges.tar.gz
解説など
Google先生で「tar find」などと検索すると、上から順に参考になるページが出てくるが、重大なミスに気づいていないサイトが多すぎる。標準的に示唆されるやり方は、
find -name "hoge*" -print0 | xargs -0 tar cvzf hoges.tar.gz
などとして、findの結果をxargsにまとめるものだ。findの引数「-print0」は、検索結果を「null」で区切って渡すことを指定し、xargsの引数「-0」は、引数リストが「null区切り」で渡されることを指定する。この2つの引数により、ファイル名にスペースなどが含まれていても正常にアーカイブされる。どんなにファイル数が多かろうが、xargsはきちんと処理してくれるので
ダウト
xargsは引数の長さが20 x 1024文字(もしくはシステムの最大の引数長さ)を超えると、一旦そこまでの引数でコマンドを実行し、残りの引数を別のコマンドとして実行します。つまり、上記の例で大量のファイルが検索された場合、xargsはtarを複数回に分けて実行します。結果、
hoges.tar.gzには一部のファイルしか残りません。
実はtarには便利なオプションがあります。「-T」というオプションで、アーカイブするファイル名のリストを、-T引数の後に指定したファイル名から読み込みます。んでもって、たいていのGNUプログラムはファイル名を指定すべきところに「-」と書くと、標準入力やら標準出力やらから読み込み/書き込みしようとします。さらにtarには「-null」というオプションがあり、ファイル名のリストをnull区切りで読み取ります。まさにfindのためにあるようなものです。
そこで、上記のコマンドは、以下のように書き換えるべきです。find -name "hoge*" -print0 | tar -cvz -T - --null -f hoges.tar.gz
これで、どれだけ大量のファイルがあっても、ちゃんとアーカイブされます。
蛇足
アーカイブはbzip2で超圧縮したいんです。
find -name "hoge*" -print0 | tar -cvj -T - --null -f hoges.tar.bz2
アーカイブは遠方のストレージに取りたいんです。
find -name "hoge*" -print0 | tar -cvj -T - --null | ssh user@myserver "cat - > hoges.tar.bz2"
手元のサーバにCPU負荷をかけたくないけどbzip2圧縮はしたいんです。でも遠方からこっちにssh接続はしたくないんです。ファイアウォール的な問題で。
find -name "hoge*" -print0 | tar -cv -T - --null | ssh user@myserver "bzip2 -cz > hoges.tar.bz2"
いやむしろ遠方のサーバにそのまま解凍したい。
find -name "hoge*" -print0 | tar -cv -T - --null | ssh user@myserver "cd /tmp; tar x"
快適なtarライフを・・・
未分類 LinuxOne Response to “findの結果をtarでアーカイブしたい”
-
[…] findの結果をtarでアーカイブしたい – 浦安市在住+デジカメ […]
コメントを書く
-