次のコンテンツを含むフォルダがあります(サブフォルダとファイル名は固定されており、変更できません)。
# 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を返しますmyfile
。tar
すべてが正常であるか、ファイルが欠落している場合でも0を返します。
これで:
/bin/tar -cz --ignore-failed-read data config myfile | /bin/dd of=backup.tar 2>/dev/null
stderr
(私にリダイレクトしていないことに注意してくださいtar
)存在しない場合は/dev/null
返し(もちろん他のエラーがない場合)、次のようになります。myfile
tar
0
stderr
/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
エイリアシングを防ぐことができるので、出力はより安定しています。)