LinuxやMac OS Xを使っていると、findコマンドで取得したファイルをすべてアーカイブ化したり圧縮したりしたいことがある。
そんなときは、以下のようにすればよい。

1.tarでアーカイブ化する

GNU拡張のfindコマンドを使う場合

GNU拡張のfindコマンドを使っている場合、-execでtarコマンドを呼び出してやればよい。
ただ、ここでできるのはあくまでもアーカイブ化(一つのファイルにまとめる)ことだけで、圧縮(zip化)はできないという点。

find ファイルPATH <検索条件> -exec tar -rvf 作成するアーカイブファイルPATH {} \;
blacknon@BS-PUB-UBUNTU-01:~$ find /tmp -name "test*"
/tmp/test4.txt
/tmp/test3.txt
/tmp/test5.txt
/tmp/test123
/tmp/test456
/tmp/test.txt
/tmp/test1.txt
/tmp/test6.txt
/tmp/test2.txt
/tmp/test.csv
/tmp/test1.txt}
/tmp/test.pnm
blacknon@BS-PUB-UBUNTU-01:~$ find /tmp -name "test*" -exec tar rvf test.tar {} \;
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test4.txt
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test3.txt
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test5.txt
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test123
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test456
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test.txt
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test1.txt
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test6.txt
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test2.txt
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test.csv
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test1.txt}
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test.pnm
blacknon@BS-PUB-UBUNTU-01:~$ tar tvf test.tar
-rw-rw-r-- blacknon/blacknon 117 2016-07-09 17:28 tmp/test4.txt
-rw-rw-r-- blacknon/blacknon  53 2016-07-08 21:35 tmp/test3.txt
-rw-rw-r-- blacknon/blacknon 260 2016-07-09 19:13 tmp/test5.txt
-rw-rw-r-- blacknon/blacknon  25 2016-06-21 09:40 tmp/test123
-rw-rw-r-- blacknon/blacknon  26 2016-06-21 09:48 tmp/test456
-rw-rw-r-- blacknon/blacknon   0 2016-07-07 08:04 tmp/test.txt
-rw-rw-r-- blacknon/blacknon  24 2016-07-09 18:58 tmp/test1.txt
-rw-rw-r-- blacknon/blacknon  12 2016-07-09 19:46 tmp/test6.txt
-rw-rw-r-- blacknon/blacknon  28 2016-07-08 09:51 tmp/test2.txt
-rw-rw-r-- blacknon/blacknon 119 2016-07-09 23:21 tmp/test.csv
-rw-rw-r-- blacknon/blacknon   0 2016-06-05 17:16 tmp/test1.txt}
-rw-rw-r-- blacknon/blacknon 38609 2016-06-13 08:49 tmp/test.pnm

GNU拡張でないfindコマンドを使う場合

GNU拡張されていないfindコマンドを使う場合は、xargsを利用する。

find ファイルPATH <検索条件> -print0 | tar -cvf -T - --null -f 作成するアーカイブファイルPATH
BS-VPN-MAC-01:~ root# find /tmp/ -name "test*"
/tmp//test0
/tmp//test1
/tmp//test10
/tmp//test2
/tmp//test3
/tmp//test4
/tmp//test5
/tmp//test6
/tmp//test7
/tmp//test8
/tmp//test9
BS-VPN-MAC-01:~ root# find /tmp/ -name "test*" -print0 | tar -cvf test.tar --null -T -
tar: Removing leading '/' from member names
a tmp//test0
a tmp//test1
a tmp//test10
a tmp//test2
a tmp//test3
a tmp//test4
a tmp//test5
a tmp//test6
a tmp//test7
a tmp//test8
a tmp//test9
BS-VPN-MAC-01:~ root# tar tvf test.tar
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test0
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test1
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test10
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test2
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test3
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test4
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test5
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test6
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test7
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test8
-rw-r--r--  0 user   wheel       0 Jul 10 14:53 tmp//test9

2.圧縮ファイル(tar.gz)を作成する

さて、普通のアーカイブファイルだったらGNU拡張されているfindコマンドだとexecで呼び出せたのだが、圧縮させる場合だとちょっと難しい。
このため、xargs経由でtarにfindの結果を渡す必要がある。

find ファイルPATH <検索条件> -print0 | tar -czvf -T - --null -f 作成するアーカイブファイルPATH
blacknon@BS-PUB-UBUNTU-01:~$ find /tmp -name "test*"
/tmp/test4.txt
/tmp/test3.txt
/tmp/test5.txt
/tmp/test123
/tmp/test456
/tmp/test.txt
/tmp/test1.txt
/tmp/test6.txt
/tmp/test2.txt
/tmp/test.csv
/tmp/test1.txt}
/tmp/test.pnm
blacknon@BS-PUB-UBUNTU-01:~$ find /tmp -name "test*" -print0 | tar -czvf test.tar.gz --null -T -
tar: メンバ名から先頭の `/' を取り除きます
/tmp/test4.txt
/tmp/test3.txt
/tmp/test5.txt
/tmp/test123
/tmp/test456
/tmp/test.txt
/tmp/test1.txt
/tmp/test6.txt
/tmp/test2.txt
/tmp/test.csv
/tmp/test1.txt}
/tmp/test.pnm
blacknon@BS-PUB-UBUNTU-01:~$ tar tzvf test.tar.gz
-rw-rw-r-- blacknon/blacknon 117 2016-07-09 17:28 tmp/test4.txt
-rw-rw-r-- blacknon/blacknon  53 2016-07-08 21:35 tmp/test3.txt
-rw-rw-r-- blacknon/blacknon 260 2016-07-09 19:13 tmp/test5.txt
-rw-rw-r-- blacknon/blacknon  25 2016-06-21 09:40 tmp/test123
-rw-rw-r-- blacknon/blacknon  26 2016-06-21 09:48 tmp/test456
-rw-rw-r-- blacknon/blacknon   0 2016-07-07 08:04 tmp/test.txt
-rw-rw-r-- blacknon/blacknon  24 2016-07-09 18:58 tmp/test1.txt
-rw-rw-r-- blacknon/blacknon  12 2016-07-09 19:46 tmp/test6.txt
-rw-rw-r-- blacknon/blacknon  28 2016-07-08 09:51 tmp/test2.txt
-rw-rw-r-- blacknon/blacknon 119 2016-07-09 23:21 tmp/test.csv
-rw-rw-r-- blacknon/blacknon   0 2016-06-05 17:16 tmp/test1.txt}
-rw-rw-r-- blacknon/blacknon 38609 2016-06-13 08:49 tmp/test.pnm

ログのアーカイブスクリプトとか、いろんなところで役に立つので、使い方は覚えておいたほうが良いだろう。