如何在Shell中遍历目录及子目录下匹配指定模式的文件?
解决遍历当前及子目录匹配文件的问题
问题1:脚本提示shopt: not found
这是因为你的脚本默认用sh(比如dash)执行,而sh不支持shopt命令。解决方法:
- 在脚本第一行添加bash解释器声明:
#!/bin/bash - 或者执行脚本时明确用bash调用:
bash your_script.sh
问题2:仅找到子目录中的文件
你用的**/$_pat*里,**/会匹配任意层级的子目录,但不会包含当前目录,所以当前目录下符合$_pat*的文件不会被选中。调整glob模式即可:
- 同时匹配当前目录和子目录的文件,直接组合两种模式:
for file in "$_pat"* **/"$_pat"*; do # 这里写你的文件处理逻辑,比如echo "$file" done - 建议额外启用
nullglob选项,避免无匹配文件时循环把模式字符串当作有效内容处理:shopt -s globstar nullglob for file in "$_pat"* **/"$_pat"*; do if [[ -f "$file" ]]; then # 可选:仅处理文件,排除目录 echo "找到文件:$file" fi done
完整示例脚本
#!/bin/bash # 启用必要的bash选项 shopt -s globstar nullglob # 定义你的匹配模式 _pat="your_target_pattern" # 遍历并处理文件 for file in "$_pat"* **/"$_pat"*; do if [[ -f "$file" ]]; then echo "处理文件:$file" # 在这里添加具体的文件操作逻辑 fi done
内容的提问来源于stack exchange,提问作者Ahmad
相关产品推荐
相关产品推荐

