find grep exec, resultado

2

Se eu executar o seguinte comando

find ./dir -type f -newermt 2017-04-01 ! -newermt 2018-06-30 -printf "%TY/%Tm/%Td  %TH:%TM:%.2TS   %p\n" -exec grep -E -l "pattern" {} \; | sort -n;

retornará isto:

./dir_2/01.py</br>
./dir_2/03.py</br>
./dir_2/05.py</br>
2018/05/08  08:44:55   ./dir_2/01.py</br>
2018/05/08  08:45:03   ./dir_2/02.py</br>
2018/05/08  08:45:13   ./dir_2/03.py</br>
2018/05/08  08:45:21   ./dir_2/04.py</br>
2018/05/08  08:45:28   ./dir_2/05.py</br>

mas gostaria de ter isto: (porque somente esses três arquivos contêm "padrão") (incluindo data e data e hora)

2018/05/08  08:44:55   ./dir_2/01.py</br>
2018/05/08  08:45:13   ./dir_2/03.py</br>
2018/05/08  08:45:28   ./dir_2/05.py</br>

Eu uso a versão do Ubuntu: 14.04.5 LTS trusty e encontrar a versão (GNU findutils) 4.4.2.

    
por Mario 08.05.2018 / 16:36

1 resposta

4

Colocar o -exec grep [...] antes do -printf e enviar o stdout de grep para /dev/null (precisa de sh -c ) funciona bem:

find ./dir -type f -newermt 2017-04-01 ! -newermt 2018-06-30 \
  -exec sh -c 'grep -E -l "pattern" "{}" 1>/dev/null' \; \
  -printf "%TY/%Tm/%Td  %TH:%TM:%.2TS   %p
find ./dir -type f -newermt 2017-04-01 ! -newermt 2018-06-30 -print0 | \
  xargs -0 -i -P6 grep -E -l "pattern" "{}" | \
  xargs -i find "{}" -printf "%TY/%Tm/%Td  %TH:%TM:%.2TS   %p
find ./dir -type f -newermt 2017-04-01 ! -newermt 2018-06-30 \
  -exec sh -c 'grep -E -l "pattern" "{}" 1>/dev/null' \; \
  -printf "%TY/%Tm/%Td  %TH:%TM:%.2TS   %p
find ./dir -type f -newermt 2017-04-01 ! -newermt 2018-06-30 -print0 | \
  xargs -0 -i -P6 grep -E -l "pattern" "{}" | \
  xargs -i find "{}" -printf "%TY/%Tm/%Td  %TH:%TM:%.2TS   %p%pre%" | \
sort -z -n | tr '%pre%' '\n'
" | \ sort -z -n | tr '%pre%' '\n'
" | \ sort -z -n | tr '%pre%' '\n'
" | \ sort -z -n | tr '%pre%' '\n'

Graças à sua pergunta, aprendi algo novo. Eu nem sabia que é possível filtrar find resultados como esse.

Outra opção seria usar um pouco de tubulação e xargs . Os primeiros testes de desempenho mostram que isso é um pouco mais rápido, embora eu me pergunte por quê:

%pre%

(Observe o -P6 - > Executando o comando grep em paralelo.)

    
por RoVo 08.05.2018 / 17:08