You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 05:12:27