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