如何遍历具有可执行权限的文件?解决路径匹配失败问题
解决可执行权限文件的通配符遍历问题
你的问题核心不是文件权限本身,而是shell通配符展开的局限性。可以用以下几种方法解决:
方法1:用find命令准确定位文件
find命令不依赖shell的通配符展开,能直接遍历目录匹配文件名,不受文件执行权限影响。修改你的循环如下:
for i in "${arr[@]}" do find /storage/data -maxdepth 1 -type f -name "${i}_*_R1.fastq.gz" done
-maxdepth 1限制只在/storage/data目录下查找,不递归子文件夹(如果需要递归,去掉这个参数)-type f指定只查找文件,排除目录-name后面的匹配规则和你原来的通配符一致,确保找到对应前缀的文件
方法2:显式遍历通配符匹配的文件
把原来的echo改成一个小循环,让shell强制展开通配符(只要文件存在且你有目录访问权限,就能匹配到):
for i in "${arr[@]}" do for file in /storage/data/${i}_*_R1.fastq.gz do echo "$file" done done
这种方式会逐个输出所有匹配的文件,即使有多个符合条件的文件也能处理。
方法3:检查shell的glob选项
如果以上方法还是不行,检查你的bash是否开启了影响通配符的选项:
shopt -p nullglob failglob
如果nullglob或failglob被开启,可能导致通配符不展开或报错。可以临时关闭:
shopt -u nullglob failglob
关闭后再运行你的原循环,应该能正常展开通配符。
内容的提问来源于stack exchange,提问作者Chumbs
相关产品推荐
相关产品推荐

