如何将多文件夹路径纳入Shell变量$FILES以获取多文件夹的.c文件
多文件夹文件纳入Shell脚本$FILES变量的几种方法
嘿,这个问题太常见了,我给你几个实用的方案,你根据自己的场景挑就行:
1. 直接在变量中列出多个路径模式
这是最直接的方式,如果你只有几个固定的文件夹,直接把所有路径模式写在FILES变量里就行:
# 把需要的文件夹路径都加进去,用空格分隔 FILES="./binBuild/*.c ./src/*.c ./utils/*.c ./modules/*.c" # 遍历处理每个文件 for file in $FILES; do # 这里写你的处理逻辑,比如编译、打印等 echo "正在处理文件: $file" done
⚠️ 注意:如果文件名包含空格,这种方式可能会出问题,这时候建议用下面的数组方法。
2. 使用数组存储(更安全,支持带空格的文件名)
数组是Shell脚本中处理多个元素的最佳实践,尤其是文件名可能有空格的情况:
# 定义数组,每个路径模式占一行,清晰易维护 FILES=( "./binBuild/*.c" "./src/*.c" "./utils/**/*.c" # 用**可以递归匹配该文件夹下所有子目录的.c文件(需要bash开启globstar) ) # 开启递归匹配(如果需要的话) shopt -s globstar # 遍历数组,注意用"${FILES[@]}"来保留每个元素的完整性 for file in "${FILES[@]}"; do # 示例:编译.c文件为.o文件 gcc -c "$file" -o "${file%.c}.o" done
如果不需要递归,就去掉**和shopt -s globstar这两行就行。
3. 先定义文件夹列表,再生成文件路径
如果你的文件夹数量很多,或者需要动态调整文件夹列表,可以先单独存文件夹,再批量生成文件路径:
# 先列出所有要包含的文件夹 FOLDERS=( "./binBuild" "./src" "./utils" "./test" ) # 初始化空数组存储文件路径 FILES=() # 遍历每个文件夹,添加对应的.c文件路径 for folder in "${FOLDERS[@]}"; do FILES+=("$folder"/*.c) done # 处理文件 for file in "${FILES[@]}"; do echo "处理中: $file" done
额外技巧:避免空匹配问题
如果某个文件夹下没有.c文件,默认情况下Shell会把*.c当成一个文件名来处理,这时候可以开启nullglob选项,让没有匹配的通配符直接被忽略:
# 开启nullglob shopt -s nullglob # 之后再定义FILES或者处理文件,空文件夹就不会产生无效的"*.c"条目了 FILES="./binBuild/*.c ./src/*.c"
内容的提问来源于stack exchange,提问作者218
相关产品推荐
相关产品推荐

