Разница между grep -R (прописными буквами) и -r (строчными буквами)

Если я зайду в /etc/apache2/ и наберу grep -rl 'LoadModule php' ./*, то увижу только ./mods-available/php7.0.load. Если я поменяю r на R, то увижу

./mods-available/php7.0.load
./mods-enabled/php7.0.load

Обе эти директории являются простыми. Я ожидаю, что -r заставит grep рекурсировать все файлы / каталоги в PWD. Что происходит с -r? Я склонен всегда использовать -R на этом этапе.

2
задан 13 June 2019 в 08:56

2 ответа

В соответствии с справочной страницей grep :

-r, --recursive
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; Читайте все файлы в каждом каталоге, рекурсивно, следуя символическим ссылкам, только если они находятся в командной строке. Обратите внимание, что если файловый операнд не задан, grep ищет рабочий каталог. Это эквивалентно опции -d recurse.

-R, -dereference-recursive
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; ; Читать все файлы в каждом каталоге, рекурсивно. Следуйте всем символическим ссылкам, в отличие от -r.

Пример:

У меня есть папка test , в которой есть файл 1 .txt . 2.txt является символической ссылкой на 1.txt , так что вывод ls -l test выглядит следующим образом:

-rw-r--r-- 1 kulfy kulfy 15 Jun 12 21:53 1.txt
lrwxrwxrwx 1 kulfy kulfy  5 Jun 12 21:53 2.txt -> 1.txt

Содержание 1.txt :

This is a file.

Если я хочу найти строку «file» в файлы в папке test , и я запускаю:

grep "file" test

Я столкнусь с ошибкой:

grep: test: Is a directory

Но если я это сделаю:

grep -R "file" test

Я получаю вывод:

test/2.txt:This is a file
test/1.txt:This is a file

С другой стороны, если я запускаю:

grep -r "file" test

Я получаю вывод:

test/1.txt:This is a file

Здесь, я не упомянул явно, чтобы сканировать все файлы. Поэтому, когда я использовал флаг R, символическая ссылка (здесь 2.txt ) была соблюдена, и был сгенерирован вывод. Но когда я использовал флаг r, символическая ссылка была проигнорирована просто потому, что я не упомянул также о сканировании 2.txt .

9
ответ дан 13 June 2019 в 08:56

GNU grep v2.11-8 и при вызове с помощью -r исключает символические ссылки , не указанные в командной строке, и включает их при вызове с помощью -R ( источник ).

Со страницы руководства (man grep) :

-r, --recursive Читать все файлы в каждом каталоге, рекурсивно, следуя символическим ссылкам, только если они в командной строке. Обратите внимание, что если файловый операнд не задан, grep ищет рабочий каталог. Это эквивалентно опции -d recurse.

-R, --dereference-recursive Читать все файлы в каждом каталоге, рекурсивно. Следуйте всем символическим ссылкам, в отличие от -r.

5
ответ дан 13 June 2019 в 08:56

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

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