2013-04-02 45 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加档寻找) –