Разница между grep -R (в верхнем регистре) и -r (в нижнем регистре)

Разница между 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на этом этапе.

решение1

В соответствии сman-страница grep:

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

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

Пример:

У меня есть папкатеств котором есть файл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.

Если я хочу найти"файл"строка в файлах внутритестпапку и запускаю:

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также.

решение2

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

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

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

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

Связанный контент