Если я выполню следующую команду
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;
вернет это:
./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>
, но я хотел бы иметь это: (потому что только эти три файла содержат «образец») (включая дату и время)
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>
Я использую версию Ubuntu: 14.04.5 LTS trusty и find version (GNU findutils) 4.4.2.
Помещение -exec grep [...]
перед -printf
и отправка stdout
из grep
кому: /dev/null
(потребности sh -c
) работы хорошо:
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'
Благодаря Вашему вопросу я изучил что-то новое. Я даже не знал, что возможно отфильтровать find
результаты как этот.
Другая опция состояла бы в том, чтобы использовать некоторую передачу по каналу и xargs
. Тесты премьеры показывают мне, что это даже немного быстрее, хотя интересно почему:
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'
(Отметьте -P6
-> Выполнение grep
команда параллельно.)