Если я зайду в /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
на этом этапе.
В соответствии с справочной страницей 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 .
GNU grep v2.11-8 и при вызове с помощью -r
исключает символические ссылки , не указанные в командной строке, и включает их при вызове с помощью -R
( источник ).
Со страницы руководства (man grep
) :
-r
,--recursive
Читать все файлы в каждом каталоге, рекурсивно, следуя символическим ссылкам, только если они в командной строке. Обратите внимание, что если файловый операнд не задан, grep ищет рабочий каталог. Это эквивалентно опции -d recurse.
-R
,--dereference-recursive
Читать все файлы в каждом каталоге, рекурсивно. Следуйте всем символическим ссылкам, в отличие от -r.