You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:53:22