tarからstdoutへ:PIPESTATUSに影響を与えずに入力ファイルを失います。

tarからstdoutへ:PIPESTATUSに影響を与えずに入力ファイルを失います。

次のコンテンツを含むフォルダがあります(サブフォルダとファイル名は固定されており、変更できません)。

# ls
data/ config/ myfile

tarアーカイブを作成する必要があります。標準出力dd単純化のために、Bashスクリプトで処理します。

# /bin/tar -cz data config myfile 2>/dev/null | /bin/dd of=backup.tar 2>/dev/null

このコマンドの直後に操作が成功したこと${PIPESTATUS[0]}を確認するために、変数がゼロであることを確認してください。tar

問題はそうだということだmyfile任意に選択できる私にはそれがなければ${PIPESTATUS[0]}バグで見たくないが、それがなければ2になる。それでは、tar欠落している入力ファイルを無視するように指示するにはどうすればよいですか?可能であれば、1行のステートメントを好む。

ベストアンサー1

それでは、欠落している入力ファイルを無視するようにtarにどのように指示しますか?

とても簡単です。--ignore-failed-readコマンドにフラグを使用するだけですtar

$/bin/tar -cz --ignore-failed-read data config myfile 2>/dev/null | /bin/dd of=backup.tar 2>/dev/null

$ echo ${PIPESTATUS[0]}

> 0

ところで:答えは参考にしてくださいハウクラグ面倒ですが、すべてtarが正常であるか、ファイルが存在しない場合にのみ0を返しますmyfiletarすべてが正常であるか、ファイルが欠落している場合でも0を返します。


これで:

/bin/tar -cz --ignore-failed-read data config myfile | /bin/dd of=backup.tar 2>/dev/null

stderr(私にリダイレクトしていないことに注意してくださいtar)存在しない場合は/dev/null返し(もちろん他のエラーがない場合)、次のようになります。myfiletar0stderr/bin/tar: myfile: Warning: Cannot stat: No such file or directory

tarこのマニュアルには次のように記載されています。

'--ignore-failed-read' 読み取れないファイルやディレクトリでゼロ以外の値で終了しないでください。このオプションは作成中にのみ有効です。これは、不足しているファイルまたは読み取れないファイル(ディレクトリ)をサブファイルとして扱うようにtarに指示します。これらの障害はプログラム終了コードに影響を与えず、対応する診断メッセージはエラーではなく警告として表示されます。これらの警告は、「--warning = failed-read」オプションを使用して抑制できます。

しかし残念ながら、--warning=failed-read読み取りエラーに関するすべての警告を抑制します。あなたの場合は、存在しないファイルに対する警告も抑制し、読み取りエラーに対する警告も抑制します。入出力エラー、例えば…最適とは距離が遠いです。明らかに、tar次のフラグはありません。こんにちは、ファイルが存在しない場合にのみ読み取り失敗警告を抑制します、これは問題を解決することができます。

/bin/tar -cz --ignore-failed-read data config myfile 2> >(grep -v 'No such file or directory' 1>&2) | /bin/dd of=backup.tar 2>/dev/null

>( ... )これはプロセスの交換

これによりtail、ファイルが存在しない場合、コマンドは戻り値を変更せずに見つからないファイルに関する警告メッセージを受け取らず、他の読み取りエラーに関する警告メッセージを受け取ります。


この>

私はこれらの解決策のどれもあまり良くないとは思わなかった。だから私は次の結論を下しました。

/bin/tar -cz -T <(\ls -A -1) 2>/dev/null | /bin/dd of=backup.tar 2>/dev/null

この方法では、tarコマンドの実行時に実際に存在するファイルにのみ送信できます。そのファイルの名前、またはどのファイルが存在するのか、存在しないのかを心配する必要はありません。常に同じコマンドを実行します(何が起こっても)。 1つのファイルがありません。完全に拡張できます。またはNファイルが失われてエラーを見逃すことはありません。

(知っているバックスラッシュifコマンドの前にls:これはlsエイリアシングを防ぐことができるので、出力はより安定しています。)

おすすめ記事