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