web-dev-qa-db-fra.com

trouver grep exec, résultat

Si j'exécute la commande suivante

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;

retournera ceci:

./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>

mais j'aimerais avoir ceci: (car seuls ces trois fichiers contiennent "pattern") (y compris la date et l'horodatage)

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>

J'utilise la version Ubuntu: 14.04.5 LTS fidèle et trouve la version (GNU findutils) 4.4.2.

2
Mario

Mettre le -exec grep [...] avant le -printf et en envoyant le stdout de grep à /dev/null (Besoins sh -c) fonctionne bien:

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\0" | \
sort -z -n | tr '\0' '\n'

Grâce à votre question, j'ai appris quelque chose de nouveau. Je ne savais même pas qu'il était possible de filtrer find résultats comme ça.

Une autre option serait d'utiliser des tuyaux et xargs. Les premiers tests de performances me montrent que c'est encore un peu plus rapide même si je me demande pourquoi:

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\0" | \
sort -z -n | tr '\0' '\n'

(Noter la -P6 -> Exécution de la commande grep en parallèle.)

3
pLumo