bash globから結果を1つだけ選択できますか?


14

出力に関するレポートを自動化するための作業用のスクリプトを作成しようとしています。ログファイルは(現在、将来的には「標準化」されます)この種のパス構造に保存されます。

/<root_path>/<process_one_path>/logs/<time_date_stamp>/<specific_log_file>

/<root_path>/<process_two_path>/logs/<different_time_date_stamp>/<specific_log_file>

フォルダー内の常に最新の日時スタンプを除き、パスのすべての部分が認識されます。

日付のタイムスタンプの代わりにワイルドカードを使用しようとすると、次のような複数の結果が得られます。

> ls /<root_path>/<process_two_path>/logs/* [tab]
20130102-175103
20130118-090859
20130305-213506

最新のものだけを返したいのですが、これはBashで可能ですか?

NB(私はzshを持っていません、そして、それが聞こえるほど美しいので、私たちが仕事でそれを手に入れることを疑います)

回答:


9

以下はbash 4.2で機能します。

list=( /<root_path>/<process_two_path>/logs/* )
echo "${list[-1]}"

bashが古いバージョンの場合:

list=( /<root_path>/<process_two_path>/logs/* )
echo "${list[${#list[@]}-1]}"

これは間違いなく自宅のコンピューターで動作しますが、職場で動作することを保証することはできませんか?
Pureferret

@Pureferret動作しない可能性のある部分は、負の配列インデックス(-1)です。これはbash 4.2で追加されました。RHEL5は、おそらく最も古いサポート対象のメインストリームエンタープライズディストリビューションであり、bash 4.2.20を使用します。
パトリック

1
bashhaveの古いバージョン:"${list[@]: -1}"like in ksh93[-1]from from zsh)。
ステファンシャゼル

@Patrick-RHEL5はbashを使用し3.2ます。RHEL 3および4は、延長された寿命の下でも引き続きサポートされます。
ヨルダン

1
@Pureferretまた、配列の長さで算術演算を行うことができます、私の編集を参照してください。
ジル 'SO-悪であるのをやめる'

10

POSIXly:

 set -- /<root_path>/<process_two_path>/logs/*
 shift "$(($# - 1))"
 printf '%s\n' "$1"

あなたが言及しているのでzsh

 print -r /<root_path>/<process_two_path>/logs/*([-1])

4

bash forループでbash globを使用します。このような:

for filename in <logdir>/*; do :; done; echo "$filename"

これは、bashがアルファベット順にソートされたグロブ展開を行うという事実に依存します。詳細については、bashのマニュアルを参照してください。これはLC_COLLATEに依存することに注意してください。これfilenameは、ループが終了した後、変数に最後の値がまだ含まれているという事実にも依存します。

最も古いタイムスタンプを持つファイル名が必要な場合は、次のようにします。

for filename in <logdir>/*; do echo "$filename"; break; done

1

-1はパイプラインのデフォルトであり、ls出力はすでにソートされているはずです。

ls | tail -n1

他の人が最初または最後の結果をインタラクティブに挿入する方法を探していた場合、.inputrcでmenu-completeまたはmenu-complete-backwardをバインドできます。

"\e\t": menu-complete
"\e[Z": menu-complete-backward # shift-tab

show-all-if-ambiguousが有効になっている場合、set completion-query-items 0101以上の結果がある場合にプロンプ​​トを削除しset page-completions off、ページャーを無効にします。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.