Localizando nomes de arquivos sem diretórios

3

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.

    
por Luke 19.11.2010 / 01:21

3 respostas

2
find . -maxdepth 1 -type d -printf "%f
find . -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
    
por 19.11.2010 / 04:09
2

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' \;
    
por 19.11.2010 / 02:15
0

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 .

    
por 19.11.2010 / 22:59