76.《Bioinformatics Data Skills》之shell find命令

前面我們提到pipeline處理多個文件有兩種方式,一種是先讀取存儲數(shù)據(jù)信息的配置文件,另一種是直接通過一定的條件選取數(shù)據(jù)。通過find命令可以幫助我們靈活的查找相關(guān)文件,下面具體介紹一下。

Find 表達(dá)式

find的使用格式為:find 路徑 表達(dá)式。路徑不必多說,可以使用 . 代表當(dāng)前路徑,關(guān)鍵點在于表達(dá)式。由于find命令是遞歸查看當(dāng)前目錄的,不加其它參數(shù)可以用來展示指定目錄的文件結(jié)構(gòu):

$ find data
data
data/seqs
data/seqs/zmaysB_R1.fastq
data/seqs/zmaysB_R2.fastq
data/seqs/zmaysA_R1.fastq
data/seqs/zmaysA_R2.fastq
data/seqs/zmaysC_R1.fastq
data/seqs/zmaysC_R2.fastq

可以指定-maxdepth來查找深度:

$ find data -maxdepth 1
data
data/seqs

find表達(dá)式本質(zhì)上是判斷,可以通過很多屬性來查找文件,例如文件名、文件的創(chuàng)建時間和文件的屬性等。其中文件名是最常用的操作,例如我們想要查找目錄中zmaysA相關(guān)的fastq文件,可以使用如下命令:

$ find data/seqs/ -name "zmaysA*.fastq"
data/seqs/zmaysA_R1.fastq
data/seqs/zmaysA_R2.fastq

可以通過-type f參數(shù)指定結(jié)果只返回文件而不是目錄:

$ find data/seqs/ -name "zmaysA*.fastq" -type f
data/seqs/zmaysA_R1.fastq
data/seqs/zmaysA_R2.fastq

注:一般來說,-type我們只會用到f(文件),d(目錄)和l(鏈接)參數(shù)值。

多個find表達(dá)式之間可以通過邏輯組合,默認(rèn)使用-and,所以上條命令等價于:

$ find data/seqs/ -name "zmaysA*.fastq" -and -type f
data/seqs/zmaysA_R1.fastq
data/seqs/zmaysA_R2.fastq

通過-or參數(shù)查找A與B樣本數(shù)據(jù):

$ find data/seqs/ -name "zmaysA*.fastq" -or -name "zmaysB*.fastq"
data/seqs/zmaysB_R1.fastq
data/seqs/zmaysB_R2.fastq
data/seqs/zmaysA_R1.fastq
data/seqs/zmaysA_R2.fastq

由于這里只有A,B,C三個樣本,上條命令又等價于查找非C樣本數(shù)據(jù):

$ find data/seqs/ -type f -not -name "zmaysC*.fastq"
data/seqs/zmaysB_R1.fastq
data/seqs/zmaysB_R2.fastq
data/seqs/zmaysA_R1.fastq
data/seqs/zmaysA_R2.fastq

假如此目錄下有一個臨時文件叫做zmaysB_R1-temp.tastq,而我們不想分析它,可以再加一條邏輯判斷:

$ find data/seqs/ -type f -not -name "zmaysC*.fastq" -not -name "*-temp*"
data/seqs/zmaysB_R1.fastq
data/seqs/zmaysB_R2.fastq
data/seqs/zmaysA_R1.fastq
data/seqs/zmaysA_R2.fastq

find表達(dá)式的完整參數(shù)與用法介紹如下表格所示:

image-20211026195315299

對找到的文件執(zhí)行操作

find參數(shù)-exec可以對每個匹配的文件執(zhí)行指定操作,以一個具體例子說明。

首先創(chuàng)建一批臨時文件:

$ touch data/seqs/zmays{A,B,C}_R{1,2}-temp.fastq
$ ls data/seqs/
zmaysA_R1.fastq       zmaysB_R1.fastq       zmaysB_R2-temp.fastq  zmaysC_R2-temp.fastq
zmaysA_R1-temp.fastq  zmaysB_R1-temp.fastq  zmaysC_R1.fastq
zmaysA_R2.fastq       zmaysB_R1-temp.tastq  zmaysC_R1-temp.fastq
zmaysA_R2-temp.fastq  zmaysB_R2.fastq       zmaysC_R2.fastq

假如我們想要刪除-temp.fastq結(jié)尾的臨時文件,可以使用find命令實現(xiàn):

$ find data/seqs/ -type f -name "*-temp*" -exec rm -i {} \;
rm: remove regular empty file `data/seqs/zmaysB_R1-temp.tastq'? y
rm: remove regular empty file `data/seqs/zmaysA_R1-temp.fastq'? y
rm: remove regular empty file `data/seqs/zmaysA_R2-temp.fastq'? y
rm: remove regular empty file `data/seqs/zmaysB_R1-temp.fastq'? y
rm: remove regular empty file `data/seqs/zmaysB_R2-temp.fastq'? y
rm: remove regular empty file `data/seqs/zmaysC_R1-temp.fastq'? y
rm: remove regular empty file `data/seqs/zmaysC_R2-temp.fastq'? y

解釋:在-exec參數(shù)后面指定想要執(zhí)行的操作rm,增加-i來提供確定選項增加安全性。{}是占位符,指代find查找的結(jié)果,結(jié)尾的\;是必要的,代表命令結(jié)束。

由于這樣的刪除操作很常用,find有一個專門的參數(shù)-delete(替代-exec -rm)。事實上這里的rm命令可以替換為我們想要執(zhí)行的任何命令包括常規(guī)的生物信息分析,不過find -exec一般執(zhí)行較簡單的操作,對于復(fù)雜的任務(wù),xargs是一個更好的選擇(下節(jié)介紹)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容