2013-04-02 3 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

Использование Shopt:

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

Значение:

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

Спасибо, Но был ли точно? Создание списка всех файлов и файлов в текущем каталоге? –

+1

shopt - это команда, которая в этом случае обеспечивает расширенное подтягивание. ! не будет работать, как указано выше, без установки опции extglob. – Guru

+1

«shopt -s» позволяет использовать некоторые функции оболочки. В этом случае это функция «extglob», которая позволяет расширенное сопоставление шаблонов. – brotherofken

1

Я хотел бы использовать перевернутый матч Grep:

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

Это должно избавиться от чего-либо с ".RC." или "вторичный". в названии, которое звучит так, как вы хотите.

Это может быть не самый элегантный, но он работает.

+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 плюс файлы для поиска) –

Смежные вопросы