如何使用正则表达式匹配 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将会一直进行file1,直到“完成”(从不)到达 之前file2。但是,multitail同时处理多个文件。sudo apt install multitail;man multitail

相关内容