前面我們提到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ù)與用法介紹如下表格所示:

對找到的文件執(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é)介紹)。