Как может я grep шаблоны только в файлах с определенным именем файла?

Я провел много времени, ища существующий вопрос о моей проблеме, но мне не удалось найти любое решение для этого случая в определенном. Я приношу извинения заранее, если бы существует существующий поток/вопрос, решая его и ценил бы, если кто-либо мог бы указать на меня вперед.

Я должен искать шаблон (например, "ГЕН") среди многочисленных файлов в системе передачи и обработки данных. Однако набор данных называют следующим образом:

foo_1549474392_93.nwk
foo_1549474392_93.ort.final.nwk
foo_1549474392_93.ort.nwk
foo_1549474392_93.ort_reroot.nwk

Это текстовые файлы для анализа n# 93. Существуют 550 всего. Вещь, я должен найти шаблон только в файлах названным как "foo_1549474392_93.nwk" (т.е.: что-либо + подчеркивает + цифра (цифры) + .nwk, с числами, идущими от 1 до 550, не 001 - 550). Все остальное перед подчеркиванием не важно.

Я уже попробовал это

grep "GENE" *'/d'.nwk 

и много изменений с помощью [0-9] и так далее.

Большое спасибо за справку!

1
задан 8 February 2019 в 03:22

1 ответ

Для поиска любого файла, имя которого соответствует чему-либо + подчеркивание + цифры + .nwk, с цифрами, идущими от 1 до 550 и, исключая 001, 551, и т.д., попытка:

shopt -s nullglob; grep GENE  *_{1..550}.nwk

Поскольку {1..550} расширяется до чисел, которые Вы хотите (и только числа, которые Вы хотите), шарик *_{1..550}.nwk будет включать только файлы, которые Вы хотите. Чтобы гарантировать, что все файлы в расширении на самом деле существуют в каталоге, мы устанавливаем nullglob с shopt -s nullglob.

Так как Вы не можете хотеть, чтобы изменение в nullglob влияло на другие команды, может быть полезно использовать parens для помещения команды в подоболочку.

(shopt -s nullglob; grep GENE  *_{1..550}.nwk)

Изменение в nullglob влияет только на подоболочку (что в parens), и ничто прежде или после.

Пример

Давайте создадим четыре файла с GENE, два, которые соответствуют Вашим критериям имени файла и два, которые не делают:

$ echo GENE | tee bad_1224_01.nwk bad_3456_551.nwk good_23456_1.nwk good_763456_550.nwk
GENE
$ ls
bad_1224_01.nwk  bad_3456_551.nwk  good_23456_1.nwk  good_763456_550.nwk

Теперь, давайте выполним нашу команду:

$ (shopt -s nullglob; grep GENE  *_{1..550}.nwk)
good_23456_1.nwk:GENE
good_763456_550.nwk:GENE

Нежелательные файлы исключены, и хорошие имена найдены.

Для сравнения давайте попробуем:

$ grep "GENE" *[0-9].nwk 
bad_1224_01.nwk:GENE
bad_3456_551.nwk:GENE
good_23456_1.nwk:GENE
good_763456_550.nwk:GENE

Это соответствует нежелательным файлам.

2
ответ дан 7 December 2019 в 13:18

Другие вопросы по тегам:

Похожие вопросы: