ディレクトリ指定ではなく、以下のようにfindの結果でフィルタリングした大量のファイルをtar書庫にしたい時があります。
takk~$ find 条件 | xargs tar cf foo.tar
まずは実験用の10000個のファイルを生成します。
takk~$ mkdir tmp takk~$ cd !$ cd tmp takk~/tmp$ touch {1..10000} takk~/tmp$ ls | head 1 10 100 1000 10000 1001 1002 1003 1004 1005 takk~/tmp$ ls | wc -l 10000 takk~/tmp$ cd .. takk~$
ではファイルを書庫にしてみましょう。findとxargsでtarへ渡します。
takk~$ ls tmp takk~$ find tmp -type f | xargs tar cf t.tar takk~$ tar tf t.tar | head tmp/1466 tmp/4976 tmp/751 tmp/8042 tmp/2902 tmp/4555 tmp/4143 tmp/3712 tmp/8223 tmp/4811 takk~$ tar tf t.tar | wc -l 10000 takk~$ rm t.tar
tar tオプションの結果は元のファイルの個数と同じとなりましたので、当然問題ありませんね。
しかし、もっとファイル数を増やすと結果が変わってきます。
20000個にしてみましょう。
takk~$ cd tmp takk~/tmp$ touch {1..20000} takk~/tmp$ ls | wc -l 20000 takk~/tmp$ cd .. takk~$ find tmp -type f | xargs tar cf t.tar takk~$ tar tf t.tar | wc -l 5784 takk~$
結果は、20000ではなく、5784とデタラメなファイル数になっています。
tar rオプションを指定すれば、これを回避できます。
takk~$ find tmp -type f | xargs tar rf t.tar takk~$ tar tf t.tar | wc -l 20000 takk~$
他にも回避方法はあります。
takk~$ tar cf t.tar `find tmp -type f` takk~$ tar tf t.tar | wc -l 20000 takk~$
コメント