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

7-1.ファイル・アーカイブ

ディレクトリ指定ではなく、以下のように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~$ 

コメント

タイトルとURLをコピーしました