Bash遍历目录排除指定模式文件及printf输出斜杠丢失问题
Bash脚本问题修复方案
含「Reverse」文件名过滤实现
原逻辑直接遍历目录下所有.fna后缀文件,没有做过滤,只需要在循环内部、业务逻辑执行前增加文件名判断即可:
- 利用已有的
s=${i##*/}拿到剥离路径的纯文件名 - 通过bash内置通配符匹配判断文件名是否包含
Reverse字符串,命中则直接用continue跳过当前循环,不需要调用外部命令,执行效率更高。
路径开头斜杠丢失问题排查
斜杠丢失是代码笔误导致的:
原printf语句中outdir参数写为outdir=/%s,在%s占位符前多写了一个/。但你定义的outputDir变量本身就是以/开头的绝对路径,结尾还自带了/,拼接后得到的$outputDirs本身就是合法的/开头绝对路径,这个多余的斜杠会干扰printf的参数解析、后续命令的参数空格分割逻辑,直接把路径首字符吞掉,删掉这个多余的斜杠就能解决问题。
额外优化点:所有变量引用统一加双引号包裹,避免路径包含空格、特殊字符时出现参数拆分错误;增加文件存在性判断,兼容目录下无匹配fna文件时通配符不生效的异常场景。
修复后完整可运行代码
DIRECTORY=/Users/Qi.Wang/projects/CH12F3/data/CH12F3.LAM-HTGTS_mMYC.220512 outputDir=/Users/Qi.Wang/projects/CH12F3/ pw=$(pwd) cat blank.txt > ./config.txt c="$pw/config.txt" o=0 for i in "$DIRECTORY"/*.fna; do # 无匹配fna文件时直接跳过,避免把通配符字符串当文件名处理 [ -e "$i" ] || continue s=${i##*/} # 跳过文件名带Reverse的文件 if [[ $s == *Reverse* ]]; then continue fi ((o=o+1)) b=${s%.fna} b="${o}_$(echo "$b" | awk '{ gsub(/_PairEnd+/, " " ); print $1 }')" outputDirs="$outputDir$b" printf "%s\t" "$b" >> ./config.txt printf "%s\t" "$s" >> ./config.txt cat end.txt >> ./config.txt # 移除outdir后多余的斜杠,变量全部加双引号避免解析异常 printf "perl /Users/andy/projects/HTGTS/pipeline/align_tools/TLPpipeline.pl %s %s which=%s assembly=mm9 blatopt=mask=lower outdir=%s -skipred -skipredadd -skipblu -skipbluadd \n" "$c" "$DIRECTORY" "$o" "$outputDirs" >> ./command.sh done
内容的提问来源于stack exchange,提问作者user3147833
相关产品推荐
相关产品推荐

