2013-04-02 42 views
3

我有文件名看起來像這樣的列表:從文件列表中選擇文件

tRapTrain.Isgf3g.2853.2.v1.primary.RC.txt  tRapTrain.Yox1.txt 
tRapTrain.Isgf3g.2853.2.v1.primary.txt   tRapTrain.Ypr015c.txt 
tRapTrain.Isgf3g.2853.2.v1.secondary.RC.txt  tRapTrain.Yrm1.txt 
tRapTrain.Isgf3g.2853.2.v1.secondary.txt  tRapTrain.Zbtb12.2932.2.v1.primary.RC.txt 

現在我需要選擇與primary.txt的文件和所有在沒有最後的後綴找到該文件。最終後綴== primary.RC.txt,secondary.RC.txt,secondary.txt。

所以我期望的結果應該是:

tRapTrain.Isgf3g.2853.2.v1.primary.txt 
tRapTrain.Yox1.txt 
tRapTrain.Ypr015c.txt 
tRapTrain.Yrm1.txt 

我試着用ls tRap*primary.txt做到這一點,但無法弄清楚如何做一次兩個選擇。任何幫助表示讚賞。

回答

1

使用禁用了javascript:

$ shopt -s extglob 
$ ls !(*primary.RC.txt|*secondary.RC.txt|*secondary.txt) 

含義:

!(pattern-list) 
Matches anything except one of the given patterns. 
+0

謝謝,但是確實沒有shopt嗎?創建當前目錄中所有目錄和文件的列表? –

+1

shopt是一個命令,在這種情況下可以啓用擴展通配符。 !!如果不設置extglob選項,將無法如上工作。 – Guru

+1

「shopt -s」啓用某些外殼功能。在這種情況下,它是「extglob」功能,可以擴展模式匹配。 – brotherofken

1

我會用一個倒置的grep匹配:

ls tRap* | grep -v "\.RC\." | grep -v "\.secondary\." 

這應該擺脫任何東西 「.RC」。或「。secondary」。在標題中,這聽起來像你想要的。

這可能不是最優雅的,但它的工作原理。

+0

事實上,這是不是最優雅,但它工作順利我會嘗試哪個答案最適合我,而不是接受答案。 –

+0

解析'ls'的輸出是不合適的,因爲如果任何文件名包含換行符,它將無法按預期工作。 – chepner

+0

@chepner - 但實際上,這不太可能。 – tjameson

2

您可以使用找到

find * -type f -not -name "*.secondary.RC.txt" -not -name "*.primary.RC.txt" -not -name "*.secondary.txt" -print 
+0

感謝它的完美和快速! (我有10K加檔尋找) –