Linux Bash-替代:ls | grep

Linux Bash-替代:ls | grep,linux,bash,if-statement,grep,ls,Linux,Bash,If Statement,Grep,Ls,我在脚本中使用以下管道作为变量: match=$( ls | grep -i "$search") 然后在if语句中使用: 如果我不想使用find,还有什么替代方案? 建议: ls/directory/target\u文件\u模式 但是我没有正确的语法来得到相同的结果。 另外,如果if语句没有匹配项,则我不希望输出。如果您只想知道是否存在与bash的匹配项,可以使用内置的compgen如下: if compgen -G 'glob_pattern_like_your_grep' >/de

我在脚本中使用以下管道作为变量:

match=$( ls | grep -i "$search")
然后在if语句中使用:

如果我不想使用find,还有什么替代方案? 建议:

ls/directory/target\u文件\u模式

但是我没有正确的语法来得到相同的结果。
另外,如果if语句没有匹配项,则我不希望输出。

如果您只想知道是否存在与
bash
的匹配项,可以使用内置的
compgen
如下:

if compgen -G 'glob_pattern_like_your_grep' >/dev/null; then
    echo "matches found"
else
    echo "no matches found"
fi
如果要对匹配的文件进行操作,
find
通常是作业的正确工具:

find . -name 'glob_pattern_like_your_grep' -exec 'your command to operate on each file that matches'
但关键是必须使用正则表达式类型的模式,而不是正则表达式类型的模式

如果您的
find
支持它,那么您可能能够匹配类似的正则表达式

find . -regex 'pattern'
并在
if
或与
-exec
一起使用
查找中使用:

match="$(find . -path "*${search}*" -printf "." | wc -c)"
$match
将包含匹配数。您可以这样检查:

if [ "${match}" -gt 0 ] ; then
    echo "${match} files found"
else
    echo "No files found"
fi

为什么您不想使用
查找
?这就是它擅长的地方。我不想做递归搜索,代码也很简单,我喜欢find,但我不能确信使用finds
-maxdepth
使用ls-pathtofile>/dev/null 2>&1,然后使用退出状态,即$?在你的if语句中。@RamanSailopal在这种情况下更好地
test-f
,但我认为他甚至还没有弄清楚globs、BREs和EREs之间的区别。进一步思考,这个问题可能没有足够的信息来回答-我们需要知道模式是什么样子。注意,根据你的确切输入,
compgen
可能会非常慢(比如,我有一个案例,
grep
可以瞬间处理的东西大约需要一分钟)。谢谢,这也是一个非常好的解决方案,我会接受Eric Renouf的回答,因为他提出了一些与查找无关的东西,并解释了glob和regex类型的模式。但绝对是一张赞成票!如果使用的是
-regex
而不是
-path
,那么
find
命令需要什么样的外观?如果
$search
是一个有效的regex(请查看find手册页),它只是
-regex“${search}”
而不是
-path
if [ "${match}" -gt 0 ] ; then
    echo "${match} files found"
else
    echo "No files found"
fi