使用Shell遍历子目录执行操作时无法匹配R1.fastq文件问题求助
Shell脚本未匹配到R1.fastq文件的原因分析
- 条件判断逻辑错误:你脚本中
if [ -d "${i}" ]里的-d参数作用是判断指定路径是否为目录,但你要处理的是后缀为R1.fastq的普通文件,就算匹配到了符合命名规则的文件,这个判断也会返回假,直接跳过后续执行逻辑。如果要判断目标为普通文件,应该把-d改为-f。 - 通配符匹配范围有限:你使用的
./*/*R1.fastq只能匹配当前目录下一级子目录里的目标文件,如果你的R1.fastq文件存放在二级及更深的子目录中,这个通配符规则无法匹配到对应文件。如果需要递归匹配所有层级子目录,可开启bash的globstar选项后使用./**/*R1.fastq匹配,或者直接使用find命令检索文件。 - 未开启nullglob选项导致空匹配无反馈:bash默认配置下如果通配符没有匹配到任何文件,会把通配符字符串本身(也就是
./*/*R1.fastq这个字符串)赋值给循环变量i,此时判断该字符串对应路径是否为目录必然返回假,也不会有任何执行输出。你可以在脚本开头添加shopt -s nullglob,让通配符匹配不到文件时直接展开为空,循环就不会执行。
以下是修正后的参考脚本:
# 开启nullglob避免空匹配问题 shopt -s nullglob # 如果需要递归所有子目录,可取消注释以下两行开启globstar,替换循环的匹配规则 # shopt -s globstar # for i in ./**/*R1.fastq; for i in ./*/*R1.fastq; do # 改为判断是普通文件 if [ -f "${i}" ]; then echo "${i}" # 变量加引号避免文件名含空格时报错 python2.7 demultadapt.py -f "$i" -p Demul-01-R1 FILE_ADAPT fi done
内容的提问来源于stack exchange,提问作者jaktykusuma
相关产品推荐
相关产品推荐

