найти grep exec, результат

Если я выполню следующую команду

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.

2
задан 9 May 2018 в 16:42

1 ответ

Помещение -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 команда параллельно.)

3
ответ дан 2 December 2019 в 02:43

Другие вопросы по тегам:

Похожие вопросы: