Я хочу найти строку "this table ..." в каталоге /home/myuser рекурсивно, то есть во всех файлах в /home/myuser и во всех каталогах и подкаталогах в /home/myuser .

В каталоге /home/myuser установлена переменная окружения: $MYUSR

Поиск должен быть без учета регистра, и он должен дать мне полный путь к файлам, содержащим строку «this table ...».

Я попробую:

grep -R "this table..." $MYUSR

но я не уверен, что он действительно ищет, потому что я жду долго, и он не возвращает никакого результата, и он никогда не заканчивается.

Я также хочу знать, как сделать такой же рекурсивный поиск в каталоге, в котором я нахожусь, например:

grep -R "this table..." .

Как мне это сделать?

2 ответа2

2

Это зависит от размера каталога и подкаталогов, в которых вы выполняете поиск. Но ack будет лучше соответствовать вашим потребностям. Смотрите http://betterthangrep.com/

2
  find $MYUSR -type f -print0 | xargs -0 -n 10 grep -i -l 'this table...'

Варианты для find :

  • -type f - мы не хотим искать каталоги (только файлы в них), устройства и т. д.
  • -print0 - мы хотим иметь возможность обрабатывать имена файлов, содержащие пробелы

Варианты к xargs являются

  • -0 - из-за поиска -print0
  • -n 10 - запускать grep для 10 файлов одновременно (полезно, когда не используется grep -l)

Варианты grep:

  • -i - игнорировать регистр
  • -l - просто перечислить имена файлов (не все совпадающие строки)
  • -f - трактовать точки в поисковом выражении как обычные старые точки.

Для запуска в текущем каталоге замените $MYUSR на .


Обновление (один из суперпользователей предложил find -type f -exec grep -i "this table..." +)

$ ls -1
2011
2011 East
2011 North
2011 South
2012


$ find -type f -exec grep -i 'this table...'
find: missing argument to `-exec'

$ find -type f -exec grep -i 'this table...' +
find: missing argument to `-exec'

$ find -type f -exec grep -i 'this table...' {} \;
this table... is heavy
THIS TABLE... is important
this table... is mine
this table... is all alike
this table... is twisty

Но это не полезно, вы хотите имена файлов

$ find -type f -exec grep -i -l 'this table...' {} \;
./2011 East
./2011
./2011 North
./2011 South
./2012

Хорошо, но часто вы хотите видеть содержимое соответствующей строки

Если вы хотите, чтобы имена файлов И соответствовали содержанию строки, я делаю это следующим образом:

$ find -type f -print0 | xargs -0 -n 10 grep -i 'this table...';
./2011 East:this table... is heavy
./2011:THIS TABLE... is important
./2011 North:this table... is mine
./2011 South:this table... is all alike
./2012:this table... is twisty

Но без "старого skool" -print0 и -0 вы получите беспорядок

$ find -type f | xargs -n 10 grep -i 'this table...';
./2011:THIS TABLE... is important
grep: East: No such file or directory
./2011:THIS TABLE... is important
./2011:THIS TABLE... is important
grep: North: No such file or directory
./2011:THIS TABLE... is important
grep: South: No such file or directory
./2012:this table... is twisty

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .