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不返回任何内容。