为了账号安全,请及时绑定邮箱和手机立即绑定

测试一个glob是否在bash中有任何匹配

测试一个glob是否在bash中有任何匹配

忽然笑 2019-08-26 14:40:42
测试一个glob是否在bash中有任何匹配如果我想检查是否存在单个文件,我可以使用test -e filename或测试它[ -e filename ]。假设我有一个glob,我想知道是否存在名称与glob匹配的文件。glob可以匹配0个文件(在这种情况下我不需要做任何事情),或者它可以匹配1个或多个文件(在这种情况下我需要做一些事情)。如何测试glob是否有匹配?(我不关心有多少匹配,如果我能用一个if语句而没有循环(仅仅因为我发现最可读)这样做是最好的。(test -e glob*如果glob匹配多个文件,则失败。)
查看完整描述

3 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

Bash特定解决方案:

compgen -G "<glob-pattern>"

逃离模式或它将被预先扩展为匹配。

退出状态是:

  • 1表示不匹配,

  • 0表示“一场或多场比赛”

stdout与glob匹配的文件列表。
我认为这是简洁性和最小化潜在副作用的最佳选择。

更新:请求的示例用法。

if compgen -G "/tmp/someFiles*" > /dev/null; then
    echo "Some files exist."fi


查看完整回答
反对 回复 2019-08-26
?
临摹微笑

TA贡献1982条经验 获得超2个赞

nullglob shell选项确实是一种基础。

为了避免需要对nullglob状态进行繁琐的保存和恢复,我只在扩展glob的子shell中设置它:

if test -n "$(shopt -s nullglob; echo glob*)"then
    echo foundelse
    echo not foundfi

为了更好的可移植性和更灵活的通配,请使用find:

if test -n "$(find . -maxdepth 1 -name 'glob*' -print -quit)"then
    echo foundelse
    echo not foundfi

显式-print -quit操作用于查找而不是默认的隐式-print操作,以便find在找到与搜索条件匹配的第一个文件后立即退出。在大量文件匹配的情况下,这应该比echo glob*或者运行得快得多,ls glob*并且它还避免了扩展命令行过度填充的可能性(一些shell具有4K长度限制)。

如果发现感觉像是矫枉过正,并且可能匹配的文件数量很少,请使用stat:

if stat -t glob* >/dev/null 2>&1then
    echo foundelse
    echo not foundfi


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 606 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信