大量ファイルはtar cでなくtar rオプションを使う

ディレクトリ指定ではなく、以下のようにfindの結果でフィルタリングした大量のファイルをtar書庫にしたい時があります。

~$ find 条件 | xargs tar cf foo.tar

まずは実験用の10000個のファイルを生成します。

~$ mkdir tmp
~$ cd !$
cd tmp
~/tmp$ touch {1..10000}
~/tmp$ ls | head
1
10
100
1000
10000
1001
1002
1003
1004
1005
~/tmp$ ls | wc -l
10000
~/tmp$ cd ..
~$ 

ではファイルを書庫にしてみましょう。findとxargsでtarへ渡します。

~$ ls
tmp
~$ find tmp -type f | xargs tar cf t.tar
~$ 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
~$ tar tf t.tar | wc -l
10000
~$ rm t.tar

tar tオプションの結果は元のファイルの個数と同じとなりましたので、当然問題ありませんね。

しかし、もっとファイル数を増やすと結果が変わってきます。
20000個にしてみましょう。

~$ cd tmp
~/tmp$ touch {1..20000}
~/tmp$ ls | wc -l
20000
~/tmp$ cd ..
~$ find tmp -type f | xargs tar cf t.tar
~$ tar tf t.tar | wc -l
5784
~$ 

結果は、20000ではなく、5784とデタラメなファイル数になっています。

tar rオプションを指定すれば、これを回避できます。

~$ find tmp -type f | xargs tar rf t.tar
~$ tar tf t.tar | wc -l
20000
~$ 

他にも回避方法はあります。

~$ tar cf t.tar `find tmp -type f`
~$ tar tf t.tar | wc -l
20000
~$ 

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA