2016-12-16 3 views
0

Я хочу найти файлы в Linux в конкретном каталоге , не заглядывая в его подкаталоги, в котором содержится в их строке определенная строка. Из this ответа, я попытался это после удаления r рекурсии:Получить файлы, содержащие конкретный текст, используя Linux

grep -nw '/path/to/somewhere/' -e "pattern" 

Но это не работает. Я попытался также это с скачущим каталогом OptIn:

grep -rnw -d skip '/path/to/somewhere/' -e "pattern" 

Я попытался исключить любой каталог, который отличается от текущего каталога, но и не так:

grep -rnw -exclude-dir '[^.]' '../../path/to/somewhere/' -e "pattern" 
+0

'найти.-type f -name '* pattern *' ' –

+0

Они будут изучать все файлы в пути для' pattern'. Я думаю, это не то, что вы пытаетесь сделать. 'find' или' ls ... | grep' будет полезен – nu11p01n73R

+0

, если вы все еще хотите использовать grep try 'grep/path/to/something/* -d skip -le" pattern "' – bansi

ответ

2

Может быть, вопрос был путаным, я надеюсь, что теперь его ясно, patten должен соответствовать содержимому, а не имени файла!

Ваш вопрос не ясен, и в оригинальный ответ я показал, как найти имена файлов соответствие шаблону. Если вы хотите искать файлы с контентом, соответствующих шаблон, это так просто, как

grep 'pattern' directory/* 

(подстановка оболочки используется).

Вы можете использовать find, чтобы отфильтровать файлы перед переходом к grep:

find 'directory' -maxdepth 1 -mindepth 1 -type f \ 
    -exec grep --with-filename 'pattern' {} + 

Оригинал ответа

Grep не подходящим инструментом для поиска имен файлов, так как вам нужно, чтобы создать список файлы перед переходом на Grep. Даже если вы получите желаемые результаты с помощью команды ls | grep pattern, вам придется добавить еще один канал для обработки файлов (я думаю, вам, скорее всего, придется как-то их обработать, рано или поздно).

Вместо этого используйте find, так как он имеет свои собственные мощные функции, соответствующие шаблону.

Пример:

find 'directory' -maxdepth 1 -mindepth 1 -regex '.*pattern' 

Использование -iregex для случая нечувствительной версии -regex. Также читайте о -name, -iname, -path и -ipath.


Можно выполнить команду (или скрипт) для файлов, обрабатываются с -exec действия, например:

find 'directory' -maxdepth 1 -mindepth 1 -type f \ 
    -regex '.*pattern' -exec sed -i.bak -r 's/\btwo\b/2/g' {} + 
+1

Да, 'grep 'pattern' *' is more чем достаточно. – fedorqui

+0

Хотя он показывает ошибку для подкаталогов, но ее приемлемый ответ, THX человек! – 54l3d

1

Использования find:

find '/path/to/somewhere' -maxdepth 1 -type f -exec grep -H 'pattern' {} \; 
0

Если шаблон должен быть регулярным выражением:

ls -A /path/to/dir | grep -E PATTERN 
Смежные вопросы