2

次のような名前のファイルが 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) の組み合わせです。

4

3 に答える 3

2
    RECENT=$((ls -rt on_common* 2>/dev/null| tail -n 1 | egrep -o '[0-9]{8}') 
|| echo '0001-01-01')

あなたが望むのと同等のc1 || c2ことをします。

失敗した場合に備えて、 stderr を /dev/null ( 2>/dev/null)にリダイレクトしたことに注意してくださいls。エラーを表示したい場合は、削除できます。

于 2013-10-27T22:24:00.090 に答える
1

まず、検索式を少し短くすることができます

ls -t on_common* | egrep -om1 '[0-9]{8}'

2番目の部分では、これでうまくいくはずです

RECENT=$(ls -t on_common* | egrep -om1 '[0-9]{8}' || echo "0001-01-01")
于 2013-10-27T22:25:04.997 に答える
0

次のようなサブシェルを使用できます。

command1 |(command2 || <treatment if command2 fails>)
var=$(command1 |(command2 || <treatment if command2 fails>)) # to get the commands suite output in a variable

また、command1 が失敗した場合にのみ処理を実行する場合は、次のようにします。

(command1 || <treatment if command1 fails>)|command2
var=$((command1 || <treatment if command1 fails>)|command2) # to get the commands suite output in a variable
于 2013-10-27T22:23:54.793 に答える