检测目录下.fastq文件的Bash脚本报错 求正确实现方案
错误原因
- 核心问题:原脚本中包裹find命令的是全角引号
´而非Bash可识别的反引号`,导致find命令没有实际执行,数组内存储的是命令字符串本身,长度永远大于0,所以无论目录内是否存在.fastq文件都会误判为存在。 - 兼容性问题:用
$(ls -d */)遍历目录、直接将命令输出赋值给数组的写法,不兼容带空格、特殊字符的目录/文件名,容易出现拆分异常。 - 安全隐患:频繁cd进出目录如果遇到cd失败的情况,后续操作会在错误路径执行,存在风险。
优化实现方案
推荐用Bash内置的glob匹配实现,不需要调用外部命令,逻辑更简单稳定:
#!/bin/bash shopt -s nullglob # 匹配不到文件时返回空数组,而非返回匹配字符串本身 echo "Beginning operation" echo # 遍历当前路径下所有子目录 for folder in */; do # 去掉目录末尾的斜杠 myfolder="${folder%/}" echo echo "Entered $myfolder" # 直接匹配对应目录下的.fastq文件存入数组 fastq_files=("$myfolder"/*.fastq) if [ ${#fastq_files[@]} -gt 0 ]; then echo "There are FASTQ files, will not do the operation" else echo "There are no FASTQ files, proceeding with operation" # 你的业务操作写在此处,操作目标目录直接使用$myfolder变量即可,无需cd进入目录 fi echo "Exited $myfolder" echo done echo "Ended Operation"
如果确实需要使用find实现(比如后续要扩展为深层目录检测),可以用以下更稳妥的计数方式,兼容所有特殊文件名:
# 统计指定目录下一级的.fastq文件数量 fastq_count=$(find "$myfolder" -maxdepth 1 -type f -name "*.fastq" -printf '.' | wc -c) if [ "$fastq_count" -gt 0 ]; then # 存在.fastq文件的逻辑 fi
内容的提问来源于stack exchange,提问作者ivan199415
相关产品推荐
相关产品推荐

