2016-10-20 8 views
0

У меня есть команда find, чтобы получить все файлы, измененные за последние 50 секунд, которые соответствуют следующему регулярному выражению hell\d в последних 1000 символах. Я использую хвост, чтобы получить последние 1000 символов, чтобы ускорить поиск, потому что файлы для проверки огромны (в среднем 3gb).Как объединить две команды в -exec параметр find?

find /home/ouhma -newermt '50 seconds' -type f | 
while read fic; do 
    if tail -c 1000 "${fic}" | LANG=C LC_ALL=C grep -Pq 'hell\d'; then 
     echo "${fic}" 
    fi 
done 

Это Возможное использование -exec параметра, чтобы заменить эту уродливую петлю и получить результат еще быстрее?

Это работает, но я не знаю, если его лучший способ сделать это:

find /home/ouhma -newermt '50 seconds' -type f -exec bash -c 'LANG=C LC_ALL=C grep -Pq "hell\d" <(tail -c 1000 "{}") && echo "{}"' \; 

ответ

1

Несколько -exec действия могут следовать один за другим, один -exec будет работать, если предыдущий -exec успешно т.е. команда управляет -exec возвращает статус выхода 0.

Do:

find /home/ouhma -type f -newermt '50 seconds' -exec env LC_ALL=C \ 
     bash -c 'grep -Pq "hell\d" <(tail -c 1000 "$1")' _ {} \; -exec echo {} \; 

Как только печать имя файла, это будет достаточно, хотя:

find /home/ouhma -type f -newermt '50 seconds' -exec env LC_ALL=C \ 
     bash -c 'grep -Pq "hell\d" <(tail -c 1000 "$1") && echo "$1"' _ {} \; 
+0

Если я проверить свою команду, таким образом: 'найти /home/ouhma/hello.txt -exec LC_ALL = C Grep -Pq 'ад \ д' <(хвост -c 1000 {}) \; -exec echo {} \; ' Возвращает следующую ошибку: ' tail: невозможно открыть '{}' для чтения: Нет такого файла или каталога find: 'LC_ALL = C': Нет такого файла или каталога' – harrison4

+0

@ ouhma Проверьте мои правки. – heemayl

+0

Истечение 'bash' для каждого файла не будет быстрее, чем собственная попытка OP. – anubhava