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

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

如果我想检查是否存在单个文件,我可以使用test -e filename或测试它[ -e filename ]

假设我有一个glob,我想知道是否存在名称与glob匹配的文件。glob可以匹配0个文件(在这种情况下我不需要做任何事情),或者它可以匹配1个或多个文件(在这种情况下我需要做一些事情)。如何测试glob是否有匹配?(我不关心有多少匹配,如果我能用一个if语句而没有循环(仅仅因为我发现最可读)这样做是最好的。

test -e glob*如果glob匹配多个文件,则失败。)


忽然笑
浏览 575回答 3
3回答

阿晨1998

Bash特定解决方案:compgen&nbsp;-G&nbsp;"<glob-pattern>"逃离模式或它将被预先扩展为匹配。退出状态是:1表示不匹配,0表示“一场或多场比赛”stdout是与glob匹配的文件列表。我认为这是简洁性和最小化潜在副作用的最佳选择。更新:请求的示例用法。if&nbsp;compgen&nbsp;-G&nbsp;"/tmp/someFiles*"&nbsp;>&nbsp;/dev/null;&nbsp;then &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"Some&nbsp;files&nbsp;exist."fi

临摹微笑

nullglob shell选项确实是一种基础。为了避免需要对nullglob状态进行繁琐的保存和恢复,我只在扩展glob的子shell中设置它:if&nbsp;test&nbsp;-n&nbsp;"$(shopt&nbsp;-s&nbsp;nullglob;&nbsp;echo&nbsp;glob*)"then &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;foundelse &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;not&nbsp;foundfi为了更好的可移植性和更灵活的通配,请使用find:if&nbsp;test&nbsp;-n&nbsp;"$(find&nbsp;.&nbsp;-maxdepth&nbsp;1&nbsp;-name&nbsp;'glob*'&nbsp;-print&nbsp;-quit)"then &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;foundelse &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;not&nbsp;foundfi显式-print -quit操作用于查找而不是默认的隐式-print操作,以便find在找到与搜索条件匹配的第一个文件后立即退出。在大量文件匹配的情况下,这应该比echo glob*或者运行得快得多,ls glob*并且它还避免了扩展命令行过度填充的可能性(一些shell具有4K长度限制)。如果发现感觉像是矫枉过正,并且可能匹配的文件数量很少,请使用stat:if&nbsp;stat&nbsp;-t&nbsp;glob*&nbsp;>/dev/null&nbsp;2>&1then &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;foundelse &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;not&nbsp;foundfi
打开App,查看更多内容
随时随地看视频慕课网APP