首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash脚本,打印包含字符串的文件名

Bash脚本,打印包含字符串的文件名
EN

Stack Overflow用户
提问于 2021-01-30 23:58:01
回答 3查看 49关注 0票数 0

我有一个文件夹,里面有几个文件,我需要根据它们是都存在还是只有一个存在来组织/操作它们。

在我的名为folder1/checkthese/*.bam的文件夹中,这些文件是:

代码语言:javascript
复制
file1_aln.bam
file1_aln_sorted.bam

我有一个脚本来检查我是否有未排序的文件(它只是*_aln.bam)和排序的文件(*_aln_sorted.bam),但我无法让我的脚本正确运行,这取决于它们是否都存在。

下面是我的迷你脚本:

代码语言:javascript
复制
for files in folder1/checkthese/*.bam 
do
    if [[ ${files} =~ "_aln.bam" ]] && [[ ${files} =~ "_aln_sorted.bam" ]]
    then                                                                                                                                                                                                         
          echo "both files exist, need to delete unsorted file only"
          echo "REMOVE $(basename ${files/_aln*}_aln.bam)"
          rm -f ${files/_aln*}_aln.bam            
    elif [[ ${files} =~ "_aln_sorted.bam" ]] && [[ ! ${files} =~ "_aln.bam" ]]                                                        
    then                                                                   
          echo "Only sorted file exists, all good"                             
    fi 
done

但这是我得到的输出:

代码语言:javascript
复制
Only sorted file exists, all good.

但显然,未排序的文件是存在的,所以出于某种原因,它跳过了循环的第一部分,并且没有删除_aln.bam文件。我不确定如何更改elif语句中的条件语句,以便如果只有_aln_sorted.bam文件存在,那么一切都是好的,我不需要删除任何内容。我认为我不应该在elif语句中使用&&,但我认为!本质上就是用于此的NOT布尔值。

EN

回答 3

Stack Overflow用户

发布于 2021-01-31 00:45:03

伙计,你的比较不能做你想要的。

第一个比较是检查名称中同时包含_aln.bam和_aln_sorted.bam字符串的文件!第二个是检查名称中包含_aln_sorted.bam但不包含_aln.bam的文件!

所以这些比较在每次执行时都是在同一个文件上进行的!

你需要这样做:

代码语言:javascript
复制
#!/bin/bash

for file in /full_path/folder1/checkthese/*.bam 
do
    if [[ ${file} =~ "_aln.bam" ]]
    then                                                                                                                                                                                                         
          echo "Unsorted file was found! It will be removed!"
          echo "Removing the file named ${file}"
          rm -f ${file}
      echo "File removed!"
    elif [[ ${file} =~ "_aln_sorted.bam" ]]                                                        
    then                                                                   
     echo "${file} is a sorted file!"
    fi 
done
票数 1
EN

Stack Overflow用户

发布于 2021-01-31 00:11:46

-编辑

好吧,我修复了我的原始脚本,它不使用布尔值来检查文件名中的字符串,而是检查文件是否存在。这对我很有效:

最初我也有这个脚本,但遇到了类似的问题:

代码语言:javascript
复制
for files in folder1/checkthese/*.bam 
do
    if [ -f ${files/_aln*}_aln.bam ] && [ -f ${files/_aln*}_aln_sorted.bam ]
    then                                                                                                                                                                                                         
          echo "both files exist, need to delete unsorted file only"
          echo "REMOVE $(basename ${files/_aln*}_aln.bam)"
          rm -f ${files/_aln*}_aln.bam            
    elif [ -f ${files/_aln*}_aln_sorted.bam ] && [ ! -f ${files/_aln*}_aln_sorted.bam ]                                                    
    then                                                                   
          echo "Only sorted file exists, all good"                             
    fi 
done

输出现在可以工作了。

票数 0
EN

Stack Overflow用户

发布于 2021-01-31 01:11:07

我将提出一个不那么传统的解决方案,强调两点:

  • 更喜欢使用文件列表,就像处理其他文本数据一样
  • 将逻辑和破坏性操作分开(您可以检查要删除的内容)

首先创建一些测试文件

代码语言:javascript
复制
mkdir data
seq 1 5 | xargs -I{} touch 'data/file_{}_aln.bam'

# first three of them have their sorted equivalents
seq 1 3 | xargs -I{} touch 'data/file_{}_aln_sorted.bam'

首先,让我们检查一下我要删除哪些文件:

代码语言:javascript
复制
find data -name '*.bam' | sort | sed 's/_sorted//' | uniq -d

补充的是我还需要排序的文件:

代码语言:javascript
复制
find data -name '*.bam' | sort | sed 's/_sorted//' | uniq -u

在检查之后,我可以这样做来删除这些文件

代码语言:javascript
复制
find data -name '*.bam' | sort | sed 's/_sorted//' | uniq -d | xargs rm

最后检查是否所有未排序的内容都消失了,可以通过以下方式轻松完成

代码语言:javascript
复制
ls data/*_aln.bam 

# or to get some numeric results:
ls data/*_aln.bam | wc -l

当然,通常的警告也适用-使用合理的文件名,否则您必须使用find -print0 | xargs -0并处理后果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65970048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档