2016-02-22 79 views
0

我可以刪除不包含任何文本的目錄中的文件嗎?這些是擴展名爲「.fasta」的文本文件。起初我運行此腳本:unix:我可以刪除不包含文本的目錄中的文件嗎?

for g in `cat genenames.txt` ; do cat *${g}_*.fa > $g.fasta ; done 

在看起來像文件的列表:

  • id_genename_othername.fa

但在某些目錄中,並非所有的從列表genenames (genenames.txt)具有名稱匹配的文件。所以有時我會得到這個消息:

cat: *genename_*.fa: No such file or directory 

上面的代碼還使得與genename一個「.fasta」文件不存在,我想將其刪除。謝謝。

+0

當你說「沒有文字」是空文件,即。文件大小0字節? – kometen

+0

你需要一個'if'來測試通配符是否匹配任何東西,然後再進行捕獲。 –

+0

是的,該文件是0字節。 –

回答

0

假設你的腳本使用#!/bin/bash,我會做

shopt -s nullglob 
while IFS= read -r pattern; do 
    files=(*"$pattern"*.fa) 
    if [[ "${#files[@]}" -eq 0 ]]; then 
     echo "no files match pattern *$pattern*.fa" 
    else 
     cat "${files[@]}" > $pattern.fasta 
    fi 
done < genenames.txt 
+0

這非常接近,但並不總是工作,具體取決於文件夾中的內容。例如,我的genenames.txt文件列出了兩個基因:gene1和gene2。這些文件在每個基因之後都帶有新的行字符的文本文件中。如果文件夾包含的文件是id_gene1_othername.fa,那麼我會得到正確的輸出:一個文件名爲gene1.fasta,數據從原始文件連接起來。但是在包含文件id_gene2_othername.fa的文件夾中,名稱中沒有包含gene1的文件,輸出是兩個名爲gene1.fasta和gene2.fasta的文件,它們都是來自gene2的連接數據。 –

+0

在這種情況下,文件名中是否有**「gene1」和「gene2」兩個文件?也許我們只需要兩個下劃線的'files =(* _「$ pattern」_ *。fa)' –

+0

所有文件都是gene1或gene2。截至目前,我所在的文件夾中都有文件,這些文件可能都是基因1或全部是基因2,但我會遇到文件夾中有兩個基因的文件夾。但要確保我清楚,即使兩個基因都存在於文件夾中,每個文件都只有一個或另一個。 –

-2

您是否嘗試過以下方法?

for g in `cat genenames.txt` ; do cat *${g}_*.fa 2>/dev/null > $g.fasta ; done 

這可以防止未發現錯誤,從生產文件

+0

這會擺脫錯誤,但空文件仍然生成。 –

相關問題