grep
может искать несколько строк за один раз, а с -l
может прекратить поиск, как только найдет первую строку в каждом файле и сообщить об этом файле как о совпадении. Так что, возможно, вы просто ищете
grep -l -E 'molecule1|molecule2|molecule3|.....' file_1.gjf file_2.gjf file_3.gjf ... >files.gjf
Если вы просто хотите найти все файлы, соответствующие шаблону file_*.gjf
, тогда это очевидное и простое упрощение.
Это не позволит вамПосмотрите, какая именно строка поиска была найдена, хотя простое удаление -l
исправит это (но затем сгенерирует больше выходных данных и распечатает все совпадения с именем файла перед каждым совпадением; таким образом, потенциально больше выходных данных, чем вашпервоначальная попытка, если совпадений много).
Я использовал опцию -E
, чтобы включить другой синтаксис шаблона, который упрощает указание множества строк поиска в одном шаблоне. Вы также можете захотеть взглянуть на -f
, который позволяет вам помещать шаблоны в файл (и, возможно, также -F
для обработки каждого шаблона как буквенной строки, а не регулярного выражения).
printf '%s\n' molecule1 molecule2 molecule3 ... |
grep -Ff - -l file_*.gjf >files.gjf
Здесь мы предоставляем шаблоны "файл" на стандартном вводе (условно представленные псевдонимом -
во многих командах Unix) вместо хранения их в физическом файле. Возможно, запустите часть printf
в отдельности, чтобы посмотреть, что она производит.
Кроме того, ваши вложенные циклы можно сделать более эффективными, перемещая перенаправление после последнего done
. Каждый >>
внутри основного цикла будет открывать файл для записи и искать до конца на каждой итерации. Это довольно быстрая операция на современных компьютерах, но она по-прежнему не нужна.
for thing in list of things; do # really no point in using a variable
for other in more stuff; do
echo "$thing"
grep "$other" "file_$thing"
done
done >result
собирает весь стандартный вывод внешнего цикла в один редирект, который просто открывает файл один раз (и избегает слегка надоедливогооперация добавления, которая требует отдельной очистки файла, если вы хотите перезаписать результаты предыдущего запуска).