Если я войду /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
.