如何实现跨平台shell函数校验目录仅包含指定文件与子目录
实现方案
我们通过路径后缀区分文件和目录:传入的预期路径结尾带/表示校验目标为目录,不带则校验为普通文件。整体逻辑分为两步:
- 遍历所有预期路径,逐个校验存在性及类型是否符合要求
- 动态生成
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
相关产品推荐
相关产品推荐

