如何在Bash脚本中检查文件是否存在?实现文件不存在时无限循环直至文件出现的技术咨询
如何在Bash脚本中检测文件存在并实现循环等待
嘿,我来帮你搞定这个Bash脚本的问题!你想要实现的是:监测/mnt/c下是否存在file*.msixbundle格式的文件,不存在就一直循环提示,直到文件出现就退出对吧?先看看你当前代码的问题,再给你几个更靠谱的实现方案~
先说说你现有代码的问题
你写的这段while循环语法有问题:find命令和do之间缺少分隔符(要么加个分号,要么换行),Bash没法正确解析这个结构。另外,就算修复语法,直接用find遍历整个目录树也有点低效——每次循环都要扫一遍所有子目录,不如用更轻量的方式来判断。
方案一:修复并优化你的while循环
先把语法问题搞定,再给find加个-quit参数,让它找到第一个匹配文件就立刻退出,不用继续遍历,提升效率。另外一定要加sleep,不然循环会疯狂占用CPU:
while ! find /mnt/c -name 'file*.msixbundle' -quit 1> /dev/null 2>&1; do echo "file not found, waiting..." sleep 1 # 每秒检查一次,可根据需求调整时长 done echo "Target file found!"
如果你不需要递归查找/mnt/c的子目录,只找当前目录的话,用Bash通配符判断会更高效:
# 开启nullglob:当没有匹配文件时,通配符会展开为空,避免判断出错 shopt -s nullglob while true; do # 把匹配的文件存入数组 target_files=(/mnt/c/file*.msixbundle) # 判断数组长度,为0说明没找到 if [ ${#target_files[@]} -eq 0 ]; then echo "file not found, waiting..." sleep 1 else # 找到文件就退出循环 break fi done # 关闭nullglob恢复默认设置 shopt -u nullglob echo "Target file found!"
方案二:用until循环实现(符合你的初始想法)
你提到之前试了until循环没成功,其实until的逻辑正好契合你的需求——直到命令执行成功(文件存在)才退出循环,写法比while !更直观:
用find的until版本
until find /mnt/c -name 'file*.msixbundle' -quit 1> /dev/null 2>&1; do echo "file not found, waiting..." sleep 1 done echo "Target file found!"
通配符的until版本
shopt -s nullglob # 直到有匹配文件时退出循环 until [ -n "$(ls /mnt/c/file*.msixbundle 2>/dev/null)" ]; do echo "file not found, waiting..." sleep 1 done shopt -u nullglob echo "Target file found!"
几个关键提醒
- 必须加sleep:没有延迟的话,循环会每秒执行成百上千次,把CPU拉满,加
sleep能大幅降低资源占用。 - 递归vs非递归:
find默认会递归查找所有子目录,如果你只需要当前目录,记得给find加-maxdepth 1参数,或者用通配符的方式。 - 权限问题:如果你的用户没有
/mnt/c某些子目录的访问权限,find会输出错误信息,所以我们用2>&1把错误输出重定向到/dev/null,避免干扰正常提示。
内容的提问来源于stack exchange,提问作者Grau
相关产品推荐
相关产品推荐

