正規表現を使用してbashでファイル名を照合する方法は?つまり、tail -f /var/log/(syslog|mail.log)

正規表現を使用してbashでファイル名を照合する方法は?つまり、tail -f /var/log/(syslog|mail.log)

私は一生の間このようなコマンドを入力してきました。

tail -f /var/log/syslog /var/log/mail.log /var/log/mail.err

おそらく非常に基本的な質問かもしれませんが、答えを見つけるのに苦労しています。

毎回場所を再入力せずにフォルダ内の複数のファイルを一致させる正規表現方法はありますか?

これは数回のキーストロークを節約しましたが、それほど多くはありませんでした。

export LOGDIR=/var/log
tail -f $LOGDIR/syslog $LOGDIR/mail.log $LOGDIR/mail.err 

時にはいくつかの場所が欲しいときがあります...次のようなものを見つけたいと思います。

tail -f /var/log/(mail*|syslog|nginx/*)

(しかし実際にはその目的を達成します)

答え1

支柱の拡張を使用してください。

tail -f /var/log/{mail*,syslog,nginx/*}

例:

$ tree
├── mail.err
├── mail.log
├── nginx
│   ├── a
│   ├── b
│   └── c
├── notthis
└── syslog
$ echo {mail*,syslog,nginx/*}
mail.err mail.log syslog nginx/a nginx/b nginx/c

答え2

存在するbash

shopt -s extglob ## enable extend-glob if not enabled; default is "on"
tail -f /var/log/+(syslog|mail.+(log|err))

または明らかに:

tail -f /var/log/+(syslog|mail*)

これはファイル名のグローバルマッチングであり、ファイルにのみ適用されるため、ファイル拡張子を使用しないでください。あなたが言ったように、nginx/*代わりに中括弧拡張に基づいた解決策と答えを使うことを好むかもしれません。クワジモドあるいは、コマンドの別の引数として明示的に区切ります。

tail -f /var/log/+(syslog|mail*) /var/log/nginx/*

答え3

「完了」(なし)に達するまで実行がtail -f file1 file2続行されます。ただし、複数のファイルが同時に処理されます。 。file1file2multitailsudo apt install multitail;man multitail

関連情報