如何让Bash脚本的for循环仅遍历指定目录而不包含子目录?
解决bash遍历指定目录且仅包含当前层级的方法
问题原因说明
- 当设置
FILES="/path/to/files/"时,变量展开后只是单个路径字符串,没有通配符触发文件匹配,因此for循环无遍历对象。 - 使用
"/path/to/files/*"时,通配符会匹配目标目录下所有文件和子目录本身,所以子目录会被纳入遍历范围。
实现仅遍历当前目录的几种方案
方案1:用find命令精准控制深度和类型
find的-maxdepth 1参数可以限定仅遍历目标目录本身,结合-type f可只匹配文件(若要包含目录但不深入,去掉-type f即可):
# 基础写法(注意:文件名含空格时可能出错) for f in $(find /path/to/files/ -maxdepth 1 -type f); do # 这里写你的处理逻辑 echo "处理文件:$f" done # 更安全的写法(支持含空格/特殊字符的文件名) find /path/to/files/ -maxdepth 1 -type f -print0 | while IFS= read -r -d '' f; do echo "处理文件:$f" done
方案2:通配符配合类型判断
先开启nullglob避免无匹配时出现*本身,再通过[ -f "$f" ]判断跳过子目录:
# 开启nullglob(无匹配时变量为空,而非保留*) shopt -s nullglob # 可选:开启dotglob以匹配隐藏文件 # shopt -s dotglob for f in /path/to/files/*; do # 仅处理文件,跳过子目录 if [ -f "$f" ]; then echo "处理文件:$f" fi done # 可选:恢复默认设置 # shopt -u nullglob # shopt -u dotglob
方案3:直接匹配文件类型通配符(仅适用于已知后缀)
如果只需要处理特定后缀的文件,可直接用后缀通配符,自然不会匹配子目录:
shopt -s nullglob for f in /path/to/files/*.txt; do echo "处理txt文件:$f" done
内容的提问来源于stack exchange,提问作者Jon Griffith
相关产品推荐
相关产品推荐

