В дополнение к ранее опубликованному запросу Использование find с sh - команда не работает
find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \; -ls
Эта команда не смогла найти файлы, когда текст "archive" или "chmod" находится в нескольких строках. Однако она может сканировать файлы, когда текст "chmod" и "archive" находится в одной строке.
Поэтому попробовал эту команду, но она не дала желаемого результата.
1> find . -type f -name '*FW*' -exec grep -iEq 'chmod.*' {} \; -ls -exec grep -iEq '.*archive.*' {} +
Почему эта команда не дает желаемого результата?
Попробовал эту команду, она дает ожидаемый результат, но периодически выдает ошибку «find: 'pcregrep' terminated by signal 11'»
2> find . -type f -name '*FW*' -exec pcregrep -qM 'chmod.*(\n|.)*archive.*' {} \; -ls
Почему возникает ошибка?
решение1
Ваша вторая команда в вопросе не дает вам правильный вывод, потому что порядок тестов, которые вы используете, find
важен. Команда выведет результаты только для файлов, содержащих chmod
строку, потому что другая grep
команда запущенапосле -ls
(и не производит вывод).
Вам нужно найти файлы, содержащие как строки, так chmod
и archive
.
find . -type f -name '*FW*' \
-exec grep -Fiq chmod {} \; \
-exec grep -Fiq archive {} \; -ls
Это вызывает grep -Fiq chmod
все файлы, FW
в имени которых есть , а затем grep -Fiq archive
те, в которых первый файл grep
нашел совпадение. Если второй файл grep
также что-то нашел, то -ls
вступает в силу.