次のような名前のファイルが 0 個以上あるディレクトリがあります。
on_common_20131020.xml
on_common_20131021.xml
on_common_20131022.xml
等々。最新の日付スタンプを抽出するには、次のハックを使用できることを知っています
ls -rt on_common* | tail -n 1 | egrep -o '[0-9]{8}'
(ただし、もっと良い方法があれば知りたいです)。問題は、この値をスクリプトで取得したいので、次の行を作成することです。
RECENT=$(ls -rt on_common* | tail -n 1 | egrep -o '[0-9]{8}')
ただし、ディレクトリにそのようなファイルがない可能性があり、その場合はls
失敗します。その場合、RECENT の値を 00010101 にしたいと考えています。c2' は、コマンド c1 が失敗した場合にのみ、コマンド c2 を実行しますが、この疑似 Bash と同等のものを見つけることができませんでした。
RECENT=$(ls -rt on_common* | tail -n 1 | egrep -o '[0-9]{8}') || '00010101' # WRONG
はい、if
...fi
でこれを行うことができますが、単一の表現形式はありますか?
編集
エコーが欠落しているだけであることがわかりました。Bash 構文は次のように述べています。
リストは、演算子「;」、「&」、「&&」、または「||」のいずれかで区切られ、オプションで「;」、「&」のいずれかで終了する 1 つ以上のパイプラインのシーケンスです。 '、または改行。
だから私は、パイプラインを で区切ることができることに近かったのです||
が、 の右側の式||
はパイプラインではありませんでした (コマンドでさえありませんでした)。
そして、ここにたどり着く人のための別の衒学的なメモ。-t
ファイル名に日付スタンプがある場合にinを使用するls
のは非常に危険です。誰かが日付サンプルを含むファイル名に触れる可能性があります。私は結局:
RECENT=$(ls -1 on_common* 2>/dev/null | sort -r | egrep -om1 '[0-9]{8}' || echo '00010101')
これは、Blue Moon (dev/null にリダイレクト) と jaap の回答 (内側の括弧がなく、egrep の場合は -m) の組み合わせです。