find . -maxdepth 1 -type d -printf "%ffind . -maxdepth 1 -type d -printf "%f%pre%" | \
xargs -0 -I {} grep 'GET /{}' /var/log/apache2/blah.com
" | \
xargs -0 -I {} grep 'GET /{}' /var/log/apache2/blah.com
Como posso usar o find para encontrar arquivos sem o diretório anterior (./) de uma maneira que também funciona com o -exec?
Meu objetivo é percorrer um log do Apache para ver se algum dos arquivos foi acessado recentemente. Isto é o que eu tenho até agora:
find . -max-depth 1 -type d \
-exec grep \"GET /{}\" /var/log/apache2/blah.com \;
Eu encontrei uma solução usando -printf "% f \ n", mas isso não funciona com -exec.
Tente:
grep -Ff <(find . -maxdepth 1 -type d | sed -e 's,^\.,GET ,') /var/log/apache2/blah.com
Ou, se você quiser substituir {} no comando find
:
find . -maxdepth 1 -type d -exec bash -c 'F={}; F=${F#./}; grep -F "GET /$F" /var/log/apache2/blah.com' \;
Como você não está fazendo uma pesquisa recursiva, não é necessário usar find
, a menos que queira incluir apenas diretórios e não links simbólicos para diretórios. Supondo que não haja diretórios cujo nome comece com um ponto (se houver, use for x in .*/ */; do …
), o seguinte pesquisará os nomes de todos os diretórios e links simbólicos para diretórios no diretório atual:
for x in */; do grep -F "GET /${x%/}" /var/log/apache2/blah.com; done
Se você estava fazendo uma pesquisa recursiva, você poderia evitar um ponto inicial pesquisando a partir de *
em vez de .
(mesma observação acima com relação aos nomes que começam com um ponto).
find * -type d -exec grep -F "GET /${x%/}" /var/log/apache2/blah.com
Outra possibilidade é pós-processar a saída de find
. Isso é especialmente útil em combinação com a capacidade do grep de pesquisar múltiplos padrões separados por novas linhas.
grep -F "$(find . -type d | sed -e 's!^\.!GET !')" /var/log/apache2/blah.com
Observe que, em todos os casos, você está assumindo que não há caracteres nos nomes de diretório que seriam escapados no log do Apache. Isso é solucionável com um pouco mais de pós-processamento da saída find
.
Tags command-line find