簡體   English   中英

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

[英]Bash script, print filenames that contain a string

我有一個包含幾個文件的文件夾,我需要根據它們是否都存在或僅存在一個來組織/操作這些文件。

在我名為folder1/checkthese/*.bam的文件夾中,文件是:

file1_aln.bam
file1_aln_sorted.bam

我有一個腳本來檢查我是否有未排序的文件(只是*_aln.bam )和已排序的文件( *_aln_sorted.bam ),但我無法讓我的腳本正確運行,具體取決於它們是否都存在。

這是我的迷你腳本:

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

但這是我得到的 output:

Only sorted file exists, all good.

但顯然未排序的文件存在,因此由於某種原因它跳過了我循環的第一部分,而不是刪除_aln.bam文件。 我不確定如何在我的 elif 語句中更改條件語句,以便如果僅_aln_sorted.bam文件存在,那么一切都很好,我不需要刪除任何內容。 我認為我不應該將&&用於我的elif語句,但我認為! 本質上是NOT boolean。

伙計,你的比較不能做你想做的事。

您的第一個比較是檢查名稱包含 _aln.bam 和 _aln_sorted.bam 字符串的文件。 第二個是檢查名稱包含 _aln_sorted.bam 且不包含 _aln.bam 的文件!

所以這些比較在每次執行時都在同一個文件上工作!

你需要這個:

#!/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

- - - - - -編輯 - - - - - - - - - -

好的,我修復了我的原始腳本,該腳本不使用布爾值來檢查文件名中的字符串,而是檢查文件是否存在。 這對我有用:

最初我也有這個腳本,但遇到了類似的問題:

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

Output 現在可以工作了。

我將提出一個不太傳統的解決方案,強調兩點:

  • 喜歡處理文件列表,就像處理其他文本數據一樣
  • 將邏輯和破壞性操作分開(您可以檢查要刪除的內容)

首先創建一些測試文件

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'

首先讓我們檢查一下我要刪除哪些文件:

find data -name '*.bam' | sort | sed 's/_sorted//' | uniq -d

補充是我必須排序的文件:

find data -name '*.bam' | sort | sed 's/_sorted//' | uniq -u

檢查后,我可以做這樣的事情來刪除文件

find data -name '*.bam' | sort | sed 's/_sorted//' | uniq -d | xargs rm

最后檢查是否所有未排序的都消失了,可以通過以下方式輕松完成

ls data/*_aln.bam 

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

當然,通常的警告適用 - 使用合理的文件名,或者您必須使用find -print0 | xargs -0 find -print0 | xargs -0並處理后果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM