测试一个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
临摹微笑
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
添加回答
举报
0/150
提交
取消