Bash脚本问题:如何筛选文件名不含cds或rna的文件
问题修正:筛选不包含指定子串的文件
你的代码问题出在逻辑运算符用错了——你用了||(逻辑或),但实际需要的是&&(逻辑与)。
为什么原代码会失效?
原逻辑[ ! "$genome" == *"cds"* ] || [ ! "$genome" == *"rna"* ]的意思是:只要文件名不包含cds,或者不包含rna,就输出。这会导致:
- 包含
cds但不包含rna的文件:第二个条件成立,会被输出 - 包含
rna但不包含cds的文件:第一个条件成立,会被输出 - 只有同时包含
cds和rna的文件才会被过滤,完全不符合你要的“不包含任意一个”的需求。
修正后的代码
把||换成&&,表示文件名既不包含cds,也不包含rna时才输出:
for genome in * do if [ ! "$genome" == *"cds"* ] && [ ! "$genome" == *"rna"* ] then echo "$genome" fi done
更简洁的写法(可选)
如果你用的是bash,也可以用更简洁的方式实现:
- 用
[[ ]]的正则匹配:
for genome in * do [[ ! "$genome" =~ cds|rna ]] && echo "$genome" done
- 用
ls+grep直接过滤:
ls | grep -vE 'cds|rna'
内容的提问来源于stack exchange,提问作者Homap
相关产品推荐
相关产品推荐

