web-dev-qa-db-ja.com

Solarisでtarを作成しているときに出力をファイルにリダイレクトする方法は?

出力をリダイレクトするために以下のコマンドを使用して、Solarisでtar.gzファイルを作成しています。

cd /ebs/datatop && tar cvf - * | gzip -c > /ebs/backup/proddata.tar.gz >> /dev/null 2>> error.log

実行されると、空のファイルとして/ebs/backup/proddata.tar.gzが作成されます。エラーは発生しません。 tarファイルが/dev/nullにリダイレクトされていると想定しています。コマンド出力のみを/dev/nullにリダイレクトし、エラーをerror.logに書き込みます。

2
Girish Sunkara

tar cvf -の出力はアーカイブです。 fの引数として-を指定することで、tarにアーカイブをstdoutに出力するように指示します(その場合、|gzipのため、tarのstdoutはgzipへのパイプになります)。

vを使用してtar.gzファイルに移動するとstdoutを実行できないため、vで要求したgziperbose出力(ファイルのリスト)はstderrに出力されます。また、2> error.loggzipstderrのみをリダイレクトすることに注意してください。

詳細なファイルリスト(つまり、outputとはどういう意味かと思います)が必要ない場合は、vを省略します。また、stderrcdtarのすべてのエラーメッセージ(およびシェルによる出力ファイルのオープン)をログファイルに移動する場合は、サブシェルまたはコマンドグループのgzipをリ​​ダイレクトします。

(cd /ebs/datatop &&
   tar cf - . | gzip > /ebs/backup/proddata.tar.gz) 2>> error.log

また、現在のディレクトリをアーカイブするために、*.に置き換えました。 *は非表示でないファイルにのみ展開され、一部のファイル名で問題が発生します。

error.logは、そのcdより前の現在の作業ディレクトリに格納されます。あなたのアプローチでは、そのerror.logtar.gzファイルに格納されることになります。

そのファイルリスト(vまたはvv)をあるファイルにリダイレクトし、エラーを他のファイルにリダイレクトしたい場合は、-以外の引数をfフラグに使用する必要があります。たとえば、/dev/fd/nをサポートするシステムでこの構文を使用すると、次のようになります。

(tar cvvf /dev/fd/3 . 3>&1 > ../file.list | gzip > ../file.tar.gz) 2> ../error.log

上記では、/dev/fd/3は__stdoutを3>&1にリダイレクトする前に(../file.listを使用して)ファイル記述子3をそこにリダイレクトするため、gzipへのパイプを引き続き参照しますが、 st_outでアーカイブを送信するようにtarに指示しなくなりました。tarはstdout(../file.listにリダイレクトします)にファイルリストを自由に書き込むことができます。

7