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

如何在执行find命令前检查目录是否为空,或抑制空目录下的find命令警告?

解决空目录下find命令的警告问题

我来帮你搞定这个问题!首先得理清你当前遇到的两个核心问题:一是调用函数时带*导致空目录下通配符展开失败,二是原函数的逻辑其实不符合你“保留目录和.gitignore”的需求(原函数会直接删掉目标目录本身)。

问题根源

你调用rm_exclude_gitignore '/path-to-something/*'时,当目标目录为空,Shell没法把*展开成目录里的文件/文件夹,所以$1就变成了字面量/path-to-something/*。find命令去查找这个不存在的路径,自然会抛出“No such file or directory”的警告。另外原函数里的第一个find命令是删除目标目录本身,这显然不是你想要的结果。

修正后的解决方案

这里给你两个实用的版本,按需选择:

版本1:先检查目录内容再执行(无警告更严谨)

这个版本会先确认目录存在,再检查是否有需要删除的内容(排除.gitignore),只有存在内容时才执行删除操作,从根源避免警告:

rm_exclude_gitignore (){
    # 用local变量存储目标目录,避免全局变量污染
    local target_dir="$1"
    
    # 先检查目标目录是否存在
    if [ ! -d "$target_dir" ]; then
        echo "Error: Directory '$target_dir' does not exist." >&2
        return 1
    fi
    
    # 检查目录内是否有除.gitignore外的其他内容
    local non_ignore_content
    non_ignore_content=$(ls -A "$target_dir" | grep -v '^\.gitignore$')
    
    if [ -n "$non_ignore_content" ]; then
        # 删除目录内所有非.gitignore的文件和子目录(不删除目录本身)
        find "$target_dir" -mindepth 1 ! -name '.gitignore' -exec rm -rf {} +
    fi
}

版本2:直接抑制错误输出(简洁高效)

如果不想做额外检查,直接把find的错误输出重定向到/dev/null,空目录时的警告就不会显示了:

rm_exclude_gitignore (){
    local target_dir="$1"
    
    if [ ! -d "$target_dir" ]; then
        echo "Error: Directory '$target_dir' does not exist." >&2
        return 1
    fi
    
    # 执行删除并把错误输出丢到/dev/null
    find "$target_dir" -mindepth 1 ! -name '.gitignore' -exec rm -rf {} + 2>/dev/null
}

正确调用方式

不管用哪个版本,调用时直接传目录路径即可,不要加*:

rm_exclude_gitignore '/path-to-something'

这样既符合你“保留目录和.gitignore、删除其他所有内容”的需求,又彻底解决了空目录下的警告问题。

内容的提问来源于stack exchange,提问作者clarkk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 13:07:37