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

如何实现跨平台shell函数校验目录仅包含指定文件与子目录

实现方案

我们通过路径后缀区分文件和目录:传入的预期路径结尾带/表示校验目标为目录,不带则校验为普通文件。整体逻辑分为两步:

  1. 遍历所有预期路径,逐个校验存在性及类型是否符合要求
  2. 动态生成find命令的过滤参数,扫描测试目录下所有不在预期列表内的文件/目录,存在则校验失败

完整代码

checkdirectory() {
  # 参数校验:至少需要传入测试目录
  if [ $# -lt 1 ]; then
    return 1
  fi

  local test_dir="$1"
  shift
  local expected_paths=("$@")
  local find_args=()
  local path clean_path full_path

  # 第一步:校验所有预期路径的存在性和类型
  for path in "${expected_paths[@]}"; do
    # 移除路径末尾的所有斜杠,匹配find的输出格式
    clean_path="${path}"
    while [ "${clean_path: -1}" = "/" ]; do
      clean_path="${clean_path%/}"
    done
    full_path="${test_dir}/${clean_path}"

    if [ "${path: -1}" = "/" ]; then
      # 预期为目录,校验类型
      if ! [ -d "${full_path}" ]; then
        return 1
      fi
    else
      # 预期为普通文件,校验类型
      if ! [ -f "${full_path}" ]; then
        return 1
      fi
    fi

    # 拼接find过滤规则
    find_args+=(-not -wholename "${full_path}")
  done

  # 第二步:扫描是否存在非预期文件/目录,兼容特殊字符路径
  if find "${test_dir}" -mindepth 1 "${find_args[@]}" -print0 | tr '\0' '\n' | grep -q .; then
    return 1
  fi

  return 0
}

使用示例

完全匹配你要求的调用方式:

# 测试目录可直接用mktemp生成的随机路径
test_dir=$(mktemp -d)
# 此处为你的测试逻辑,生成对应文件和目录

if checkdirectory "${test_dir}" a.txt b.txt dir/ dir/subdir/ dir/.hidden.txt; then
  echo "ok"
else
  echo "ko"
fi

适配说明

  • 符合POSIX规范,仅使用Bash 3及以上版本特性,兼容Linux、macOS、MSYS2/MinGW环境
  • 支持任意深度路径校验,不限顶层目录
  • 基于数组传参避免空格、换行等特殊字符的解析问题
  • 无硬编码路径,完全适配mktemp -d生成的随机测试目录
  • 不对底层文件系统做额外假设

内容的提问来源于stack exchange,提问作者umläute

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 13:45:04