Использование find с sh - команда не работает

Использование find с sh - команда не работает

Я пытаюсь найти файлы, которые имеют шаблон 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

У вас есть два варианта получения путей к файлам, строки которых соответствуют вашему шаблону:

  1. Выведем findпути:

    find . -name '*FW*' -type f \
        -exec grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' {} \; -print
    

    Он запускается grepдля каждого найденного файла по отдельности, а затем выводит пути для каждого файла, содержащего совпадения с шаблоном (который я, кстати, превратил в соответствующий стандарту набор из двух отдельных базовых регулярных выражений, поскольку все остальное в ответе было стандартным).

    Вероятно, это то, что вы захотите использовать, если хотите сделать с именами путей что-то еще, а не просто вывести их в терминале (просто добавьте больше -execдействий).

  2. Выведем grepпути:

    find . -name '*FW*' -type f \
        -exec grep -l -i -e 'chmod.*archive' -e 'archive.*chmod' {} +
    

    Это работает grepс пакетами найденных файлов. grepУтилита сообщит имена путей каждого соответствующего файла, учитывая его -lопцию ("dash-ell").

    Это, скорее всего, будет работать быстрее, поскольку минимизирует количество grepвыполняемых вызовов, и это то, что вы бы сделали, если бы просто хотелисмотретьв именах путей.

Связанный контент