如何遍历环境变量指定目录列表中的所有文件?
解决Bash遍历目录文件无输出的问题
以下是几种可能的原因和对应的解决办法:
检查目录是否存在
先确认LIST_OF_DIRECTORIES里的dir1、dir2、dir3确实在当前工作目录下,或者是正确的绝对路径。可以执行ls -d $LIST_OF_DIRECTORIES验证目录是否存在,如果目录不存在,脚本逻辑会出现异常,甚至无输出。处理空目录与nullglob选项
默认Bash中,空目录下的$dir/*会被当作字面量输出(比如dir1/*),但如果你的环境开启了nullglob选项,匹配不到文件时glob会展开为空,内层for循环直接跳过,自然没有输出。
可以执行shopt nullglob查看状态:- 如果显示
nullglob on,可以先关闭它再运行脚本:shopt -u nullglob; - 或者在脚本中添加判断,确保只处理存在文件的目录:
for dir in $LIST_OF_DIRECTORIES; do if [ -d "$dir" ] && [ -n "$(ls -A "$dir")" ]; then for file in "$dir"/* ; do echo "$file" done fi done
- 如果显示
兼容含空格的目录名(更健壮的写法)
如果目录名包含空格,直接展开$LIST_OF_DIRECTORIES会被错误拆分。建议把目录列表转为数组处理:# 将环境变量转为数组 directories=($LIST_OF_DIRECTORIES) for dir in "${directories[@]}"; do # 先确认目录存在 if [ -d "$dir" ]; then # 开启nullglob让空目录不产生无效循环项 shopt -s nullglob for file in "$dir"/*; do echo "$file" done # 恢复默认设置 shopt -u nullglob fi done更简单的替代方案:用find命令
不想纠结glob的各种问题,直接用find更可靠,还能灵活控制遍历规则:# 只遍历目录下的直接文件(不包含子目录) find $LIST_OF_DIRECTORIES -maxdepth 1 -type f -print # 如果要包含目录本身和子目录,去掉-maxdepth 1即可
内容的提问来源于stack exchange,提问作者fuzzi
相关产品推荐
相关产品推荐

