найти grep exec, result

Чтобы установить минимальные требования к Ubuntu 16.04, выполните следующие действия:

sudo apt-get install libqtwebkit4 libqt4-svg
2
задан 9 May 2018 в 16:42

3 ответа

Постановка -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 параллельно.)

4
ответ дан 17 July 2018 в 14:52

Постановка -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 параллельно.)

4
ответ дан 20 July 2018 в 14:55
  • 1
    Если вы связываете имена файлов, всегда используйте нулевой символ , чтобы убедиться, что разбиение слова выполнено правильно: find … -print0 | xargs -0 … | sort -z … – dessert 9 May 2018 в 16:56
  • 2
    Хорошее предложение, обновленный ответ. Но не будет grep нарушать имена файлов, включая новую строку? – RoVo 9 May 2018 в 17:30
  • 3
  • 4
    Подождите, вам действительно нужен tr? sort -z означает, что вход с нулевым ограничением, который должен (IMO) не влиять на вывод. – dessert 9 May 2018 в 18:12
  • 5
    На самом деле я пробовал, и он не работал – RoVo 9 May 2018 в 19:31

Постановка -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 параллельно.)

4
ответ дан 20 July 2018 в 15:20
  • 1
    Если вы связываете имена файлов, всегда используйте нулевой символ , чтобы убедиться, что разбиение слова выполнено правильно: find … -print0 | xargs -0 … | sort -z … – dessert 9 May 2018 в 16:56
  • 2
    Хорошее предложение, обновленный ответ. Но не будет grep нарушать имена файлов, включая новую строку? – RoVo 9 May 2018 в 17:30
  • 3
  • 4
    Подождите, вам действительно нужен tr? sort -z означает, что вход с нулевым ограничением, который должен (IMO) не влиять на вывод. – dessert 9 May 2018 в 18:12
  • 5
    На самом деле я пробовал, и он не работал – RoVo 9 May 2018 в 19:31

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

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