Linux 如何检查bash脚本中的目录中是否存在与正则表达式匹配的文件?

Linux 如何检查bash脚本中的目录中是否存在与正则表达式匹配的文件?,linux,bash,Linux,Bash,我想得到一些帮助,找到一种方法来检查目录中是否存在与某个正则表达式匹配的文件。目前,我正在使用以下方法,但在某些情况下会返回错误: ls srv_*.log 如果目录中没有与正则表达式匹配的文件,上述命令将导致ls:cannot access srv_*.log:No此类文件或目录 我试图匹配的正则表达式是“srv.*.log” 有人有什么想法吗 谢谢。使用 一个简单的例子 find $DIR -type f -name "srv_*.log" srv_*.log不是正则表达式,而是全局匹

我想得到一些帮助,找到一种方法来检查目录中是否存在与某个正则表达式匹配的文件。目前,我正在使用以下方法,但在某些情况下会返回错误:

ls srv_*.log
如果目录中没有与正则表达式匹配的文件,上述命令将导致ls:cannot access srv_*.log:No此类文件或目录

我试图匹配的正则表达式是“srv.*.log”

有人有什么想法吗

谢谢。

使用

一个简单的例子

find $DIR -type f -name "srv_*.log" 

srv_*.log
不是正则表达式,而是全局匹配器

您只需捕获输出并将stderr重定向到/dev/null:

FILES_LIST="$(ls srv_*.log 2>/dev/null)"
for file in $FILES_LIST; do
    #something with $file
done

您甚至可以不在这里列出
文件。

来自
bash
手册页:

如果设置了nullglob选项,但未找到匹配项,则该单词为 远离的。如果设置了failglobshell选项,并且没有匹配项 找到时,将打印错误消息,并且不执行该命令

意思是你可能想

shopt -s nullglob

假设您位于良好目录中,您可以执行以下操作:

shopt -s nullglob
set -- srv_*.log
if [ $# -gt 0 ]
then
  #do your stuff
fi

$#
包含匹配文件的数量

您好,请解释一下“2>/dev/null”及其工作原理好吗?谢谢。它丢弃了stderror,不过在bash中确实不需要为此运行
ls
。实际上,如果文件中有空格,它将无法工作。它将stderr重定向到/dev/null。您必须首先了解,即使使用第一个命令,它也会工作:
ls
默认情况下将其结果放入stdout,并且只向stderr输出错误。如果执行
A=$(ls不存在文件);echo$A
无论是否向替换添加
2>/dev/null
,您都会看到echo不返回任何内容。