【问题标题】:Bash - alternative for: ls | grepBash - 替代:ls | grep
【发布时间】:2017-07-30 21:50:00
【问题描述】:

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

match=$( ls | grep -i "$search")

然后在 if 语句中使用它

if [ "$match" ]; then
    echo "matches found"
else
    echo "no matches found"
fi

如果我不想使用 find,还有什么替代方法? ShellCheck推荐:

ls /directory/target_file_pattern

但我没有正确的语法来获得相同的结果。 当 if 语句 没有匹配项时,我也希望 no output 起作用。

【问题讨论】:

  • 您为什么想使用find?这是它擅长的。
  • 我不想进行递归搜索并且代码相当简单,我喜欢 find,但我无法说服使用 finds -maxdepth
  • 使用 ls pathtofile > /dev/null 2> &1 然后使用退出状态,即美元?在你的 if 语句中。
  • @RamanSailopal 在这种情况下更好 test -f,但我认为他甚至还没有弄清楚 glob、BRE 和 ERE 之间的区别。
  • 进一步思考,这个问题可能没有足够的信息来回答——我们需要知道模式是什么样的。

标签: linux bash if-statement grep ls


【解决方案1】:

如果您只想判断是否存在与 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'

关键是您必须使用glob patterns,而不是正则表达式类型模式。

如果您的find 支持它,您也许可以匹配正则表达式

find . -regex 'pattern'

并在if-exec 中使用它

【讨论】:

  • 请注意,根据您的确切输入,compgen 可能会非常慢(例如,我有一个案例,grep 需要大约一分钟可以瞬间处理)。
【解决方案2】:

使用find:

match="$(find . -path "*${search}*" -printf "." | wc -c)"

$match 将包含匹配的数量。你可以这样检查:

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

【讨论】:

  • 谢谢,这也是一个非常好的解决方案,我会接受 Eric Renouf 的回答,因为我提出了一些与查找无关的内容以及 glob 和正则表达式类型模式的解释。但绝对是赞成票!
  • 如果find 命令使用的是-regex 而不是-path,它应该是什么样子?
  • 如果$search 是一个有效的正则表达式(检查查找手册页)它只是-regex "${search}" 而不是-path
猜你喜欢
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多