3

Как я могу использовать find для поиска файлов без предшествующего каталога (./) таким образом, который также работает с -exec?

Моя цель состоит в том, чтобы просмотреть журнал Apache, чтобы увидеть, был ли какой-либо из файлов недавно доступен. Это то, что я до сих пор:

find . -max-depth 1 -type d \
  -exec grep \"GET /{}\" /var/log/apache2/blah.com \;

Я нашел решение, используя -printf "% f\n", но это не работает с -exec.

3 ответа3

2

Пытаться:

grep -Ff <(find . -maxdepth 1 -type d | sed -e 's,^\.,GET ,') /var/log/apache2/blah.com

Или, если вы хотите заменить {} в команде find :

find . -maxdepth 1 -type d -exec bash -c 'F={}; F=${F#./}; grep -F "GET /$F" /var/log/apache2/blah.com' \;
2
find . -maxdepth 1 -type d -printf "%f\0" | \
     xargs -0 -I {} grep 'GET /{}' /var/log/apache2/blah.com
0

Поскольку вы не выполняете рекурсивный поиск, вам не нужно использовать find , если только вы не хотите включать только каталоги, а не символические ссылки на каталоги. Предполагая, что нет никаких каталогов, чье имя начинается с точки (если есть, используйте for x in .*/ */; do …), следующее будет искать имена всех каталогов и символические ссылки на каталоги в текущем каталоге:

for x in */; do grep -F "GET /${x%/}" /var/log/apache2/blah.com; done

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

find * -type d -exec grep -F "GET /${x%/}" /var/log/apache2/blah.com

Другая возможность заключается в постобработке вывода find . Это особенно полезно в сочетании со способностью grep искать несколько разделенных новой строкой шаблонов.

grep -F "$(find . -type d | sed -e 's!^\.!GET !')" /var/log/apache2/blah.com

Обратите внимание, что во всех случаях вы предполагаете, что в именах каталогов нет символов, которые могли бы быть экранированы в журнале Apache. Это решаемо с помощью немного дальнейшей постобработки результатов find .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .