Solaris の場合、質問を検索し、tar ボールに追加して圧縮する

Solaris の場合、質問を検索し、tar ボールに追加して圧縮する

Solaris 11

31 日を超えるすべてのファイルを検索し、それらを tar して、tar ファイルを圧縮します。

これを 1 行で実行したいと思います。gzip よりも pbzip2 を使用したいです。

プロトタイプとして試してみたのがこれです: find /tmp -mtime +31 -type f -name "arch*" -exec sh -c 'tar -czvPfE /tmp/old_files_$(date +%F).tar.gz $0' {} \;

これの問題点は、各ファイルに対して tar.gz を作成し、前のファイルを上書きすることです (すべてのファイルを 1 つの tar ボールにまとめたい)。"r" は tar が存在しなければ機能しません。また、"z" は pbzip2 ではなく gzip を呼び出します。

アップデート: @DopeGhoti Thank you. First, my bad for not checking the man page for the "j" option. However, this almost worked. root@myhost:/tmp# find /tmp -mtime +31 -type f -name "arch*"| wc -l =207 root@myhost:/tmp# find /tmp -mtime +31 -type f -name "arch*"| xargs tar -cjf /tmp/old_files_$(date +%F).tbz root@myhost:/tmp# l|tail -rw------- 1 root root 1.6K Nov 30 15:59 old_files_2017-11-30.tbz root@myhost:/tmp# bunzip2 old_files_2017-11-30.tbz root@myhost:/tmp# tar tf old_files_2017-11-30.tar|wc -l =15

答え1

ファイル名に改行文字が含まれていないと仮定すると、POSIX では(pbzip2明らかに例外は除きます)、アーカイブするファイルのリストがデフォルトで stdin に取り込まれます(また、デフォルトでアーカイブが stdout に書き込まれます)。

find /tmp -mtime +31 -type f -name "arch*" | pax -w | pbzip2 > file.tar.bz2

または、Solaris を使用して/オプションtarを維持するには:PE

find /tmp -mtime +31 -type f -name "arch*" |
  tar cvPEf - -I /dev/stdin | pbzip2 > file.tar.bz2

-I /dev/stdinstdin からファイル リストを取得し、f -stdout にアーカイブを出力し、その後 とpbzip2同様に圧縮しますpax

関連情報