2015-04-08 3 views
0

Ok так что этот код работаетБаша: найти с Grep, если всегда верно

if grep -lq something file.txt ; then 

Так почему что-то вроде этого оленьей кожи? Что я делаю не так?

if find . -name file.txt -exec grep -lq something {} \; 

его всегда верно, пока существует каталог.

+1

Потому что 'find' успешно завершил? –

+0

, так какой тест я должен сделать там? если файл не существует, он по-прежнему остается – v4rlo

+0

Это зависит от того, что вы хотите сделать, если шаблон сопоставлен. Если это что-то простое, вы можете добавить еще один '-exec' после первого, который будет выполняться только в том случае, если' grep' успешно. –

ответ

2

От find man page:

Выход состояния

находка завершается со статусом 0, если все файлы обрабатываются успешно, больше 0, если ошибки происходят. Это преднамеренно очень широкое описание, но если возвращаемое значение отличное от нуля, вы не должны полагаться на правильность результатов поиска.

0

Что вы получаете от своей команды - это значение выхода find, а не grep. Найти почти всегда возвращает значение выхода, равное нулю, если запрос является хорошим.

Я думал, что это может работать:

find . -name file.txt -print0 | xargs --0 grep -lq something 

Но что будет возвращать только статус завершения последнего выполнения grep. Если grep было выполнено несколько раз, вы не получите промежуточные значения. Однако это, вероятно, не будет проблемой с вашей командой.

+0

Это очень полезно. благодаря – v4rlo

0

Самый простой способ проверить, если выход find «s пуст:

output=$(find . -name file.txt -exec grep -lq something {} \;) 
if [ -n "$output" ] 
then 
    # found 
else 
    # not found 
fi 
0

Один подход, который будет короткое замыкание, как только файл, содержащий желательные содержание найдено (предполагая, что ваши намерения искать будь любых файлов матчей, в отличие от, соответствует ли каждый файл):

check_for_content() { 
    target=$1; shift 
    while IFS= read -r -d '' filename; do 
    if grep -lq -e "$target" "$filename"; then 
     return 0 
    fi 
    done < <(find "[email protected]" -print0) 
    return 1 
} 

Использование:

check_for_content thing-to-look-for -type f -name file.txt 
Смежные вопросы