Я пытаюсь найти файлы, которые имеют шаблон FW
. Из этих отфильтрованных файлов я пытаюсь найти шаблон chmod.*archive|archive.*chmod
, а затем перечислить их.
Я попробовал с помощью команды ниже, но она не дала мне желаемого результата. Нужна помощь, чтобы разобраться с этой проблемой.
find . -name '*FW*' -exec sh -c "cat {}|grep -iEq 'chmod.*archive|archive.*chmod'|ls" \;|more
решение1
Если я правильно понимаю, все, что вам нужно, это:
find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \; -ls
Это позволит grep
выполнить поиск по вашему шаблону в каждом файле, найденном с помощью find
, и, если поиск grep
прошел успешно, вывести список файлов в формате, похожем на ls -l
.
решение2
В качестве альтернативы предложению @terdon вы, вероятно, могли бы использовать следующую команду:
grep -iErl 'chmod.*archive|archive.*chmod' . | grep FW
РЕДАКТИРОВАТЬ
Как отметил @Kusalananda:
Это приведет к ошибке (неправильному выводу), если у вас есть совпадения в файлах, расположенных в каталогах, содержащих FW в своих именах.
Если настроить его так, чтобы он работал правильно, он станет гораздо менее читаемым. Решение, предложенное @terdon, является более благоприятным вариантом (и более эффективным - см. комментарий @tedron).
Тем не менее, вот исправленная версия:
grep -iErl 'chmod.*archive|archive.*chmod' . | grep -E '[^/]*FW[^/]*$'
решение3
У вас есть два варианта получения путей к файлам, строки которых соответствуют вашему шаблону:
Выведем
find
пути:find . -name '*FW*' -type f \ -exec grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' {} \; -print
Он запускается
grep
для каждого найденного файла по отдельности, а затем выводит пути для каждого файла, содержащего совпадения с шаблоном (который я, кстати, превратил в соответствующий стандарту набор из двух отдельных базовых регулярных выражений, поскольку все остальное в ответе было стандартным).Вероятно, это то, что вы захотите использовать, если хотите сделать с именами путей что-то еще, а не просто вывести их в терминале (просто добавьте больше
-exec
действий).Выведем
grep
пути:find . -name '*FW*' -type f \ -exec grep -l -i -e 'chmod.*archive' -e 'archive.*chmod' {} +
Это работает
grep
с пакетами найденных файлов.grep
Утилита сообщит имена путей каждого соответствующего файла, учитывая его-l
опцию ("dash-ell").Это, скорее всего, будет работать быстрее, поскольку минимизирует количество
grep
выполняемых вызовов, и это то, что вы бы сделали, если бы просто хотелисмотретьв именах путей.