linux - файлов - Как я рекурсивно рекурсивно?




рекурсивный поиск файлов linux (16)

глотание **

Использование grep -r работает, но оно может переполняться, особенно в больших папках.

Для более практического использования здесь приведен синтаксис, который использует синтаксис globbing ( ** ):

grep "texthere" **/*.txt

который объединяет только определенные файлы с шаблоном, выбранным шаблоном. Он работает для поддерживаемых оболочек, таких как Bash +4 или zsh .

Чтобы активировать эту функцию, запустите: shopt -s globstar .

См. Также: Как найти все файлы, содержащие определенный текст в Linux?

git grep

Для проектов под контролем версии Git используйте:

git grep "pattern"

что намного быстрее.

ripgrep

Для более крупных проектов самым быстрым инструментом ripgrep является ripgrep который по умолчанию реплицирует файлы greps:

rg "pattern" .

Он построен на основе двигателя регулярных выражений Rust, который использует конечные автоматы, SIMD и агрессивные литералы для быстрого поиска. Проверьте подробный анализ здесь .

Как я рекурсивно grep все каталоги и подкаталоги?

find . | xargs grep "texthere" *

ag - мой любимый способ сделать это сейчас github.com/ggreer/the_silver_searcher . Это в основном то же самое, что и ack, но с еще несколькими оптимизациями.

Вот короткий ориентир. Я очищаю кеш перед каждым тестом (cf https://askubuntu.com/questions/155768/how-do-i-clean-or-disable-the-memory-cache )

[email protected]$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
[email protected]$ time grep -r "hey ya" .

real    0m9.458s
user    0m0.368s
sys 0m3.788s
[email protected]:$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
[email protected]$ time ack-grep "hey ya" .

real    0m6.296s
user    0m0.716s
sys 0m1.056s
[email protected]$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
[email protected]$ time ag "hey ya" .

real    0m5.641s
user    0m0.356s
sys 0m3.444s
[email protected]$ time ag "hey ya" . #test without first clearing cache

real    0m0.154s
user    0m0.224s
sys 0m0.172s

В POSIX-системах вы не найдете параметр -r для grep и grep -rn "stuff" . не будет работать, но если вы используете команду find она будет:

find . -type f -exec grep -n "stuff" {} \; -print

Согласовано Solaris и HP-UX .


Вот рекурсивная (проверенная легко с bash и sh) функция, которая перемещает все подпапки заданной папки ($ 1) и использует grep ищет заданную строку ($ 3) в заданных файлах ($ 2):

$ cat script.sh
#!/bin/sh

cd "$1"

loop () {
    for i in *
    do
        if [ -d "$i" ]
        then
            # echo entering "$i"
            cd "$i"
            loop "$1" "$2"
        fi
    done

    if [ -f "$1" ]
    then
        grep -l "$2" "$PWD/$1"
    fi

    cd ..
}

loop "$2" "$3"

Запустив его и пример вывода:

$ sh script start_folder filename search_string
/home/james/start_folder/dir2/filename

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

find -type f -exec grep -l "texthere" {} +

Обратите внимание: -l (нижний регистр L) показывает имя файла, содержащего текст. Удалите его, если вы хотите распечатать сам матч. Или используйте -H чтобы получить файл вместе с совпадением. Все вместе, другие альтернативы:

find -type f -exec grep -Hn "texthere" {} +

Где -n печатает номер строки.


Если вы хотите следовать только фактическим каталогам, а не символическим ссылкам,

grep -r "thingToBeFound" directory

Если вы хотите следовать символическим ссылкам, а также фактическим каталогам (будьте осторожны с бесконечной рекурсией)

grep -R "thing to be found" directory

Поскольку вы пытаетесь grep рекурсивно, вам могут быть полезны следующие параметры:

-H: outputs the filename with the line

-n: outputs the line number in the file

Поэтому, если вы хотите найти все файлы, содержащие Darth Vader, в текущем каталоге или в любых подкаталогах и захватить имя файла и номер строки, но не хотите, чтобы рекурсия соответствовала символическим ссылкам, команда будет

grep -rnH "Darth Vader" .

Если вы хотите найти все упоминания слова cat в каталоге

/home/adam/Desktop/TomAndJerry 

и вы в настоящее время находитесь в каталоге

/home/adam/Desktop/WorldDominationPlot

и вы хотите захватить имя файла, но не номер строки любого экземпляра строки «кошки», и вы хотите, чтобы рекурсия соответствовала символическим ссылкам, если она их находит, вы можете запустить любое из следующих

grep -RH "cats" ../TomAndJerry                   #relative directory

grep -RH "cats" /home/adam/Desktop/TomAndJerry   #absolute directory

Источник:

запуск "grep --help"

Краткое введение в символические ссылки, для тех, кто читает этот ответ и смущен моей ссылкой на них: https://www.nixtutor.com/freebsd/understanding-symbolic-links/


На моем сервере IBM AIX (версия ОС: AIX 5.2) используйте:

find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \; 

это будет печатать путь / имя файла и относительный номер строки в файле, например:

./inc/xxxx_x.h

2865: / ** Описание: stringYouWannaFind * /

во всяком случае, это работает для меня:)


Ниже приведена команда поиска String в среде Unix и Linux .

для команды UNIX :

find . -name "string to be searched" -exec grep "text" "{}" \;

для команды Linux :

grep -r "string to be searched" .

Просто для удовольствия, быстрый и грязный поиск * .txt файлов, если ответ @christangrant слишком много, чтобы напечатать :-)

grep -r texthere .|grep .txt


Список доступных флагов:

grep --help 

Возвращает все совпадения для текстового выражения regexp в текущем каталоге с соответствующим номером строки:

grep -rn "texthere" .

Возвращает все совпадения для texthere , начиная с корневого каталога, с соответствующим номером строки и игнорируя случай:

grep -rni "texthere" /

используемые здесь флаги:

  • -r рекурсивный
  • -n номер строки печати с выходом
  • -i игнорировать дело

Теперь я всегда использую (даже в Windows с GoW - Gnu в Windows ):

grep --include="*.xxx" -nRHI "my Text to grep" *

Это включает в себя следующие параметры:

--include=PATTERN

Recurse в каталогах только поиск файла соответствия PATTERN .

-n, --line-number

Префикс каждой строки вывода с номером строки в его входном файле.

-R, -r, --recursive

Прочитайте все файлы в каждом каталоге, рекурсивно; это эквивалентно опции -d recurse .

-H, --with-filename

Распечатайте имя файла для каждого матча.

-I     

Обработать двоичный файл, как если бы он не содержал соответствующих данных;
это эквивалентно --binary-files=without-match .

И я могу добавить « i » ( -nRHIi ), если мне нужны результаты без -nRHIi регистра.

Я могу получить:

/home/vonc/gitpoc/passenger/gitlist/github #grep --include="*.php" -nRHI "hidden" *
src/GitList/Application.php:43:            'git.hidden'      => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(),
src/GitList/Provider/GitServiceProvider.php:21:            $options['hidden'] = $app['git.hidden'];
tests/InterfaceTest.php:32:        $options['hidden'] = array(self::$tmpdir . '/hiddenrepo');
vendor/klaussilveira/gitter/lib/Gitter/Client.php:20:    protected $hidden;
vendor/klaussilveira/gitter/lib/Gitter/Client.php:170:     * Get hidden repository list
vendor/klaussilveira/gitter/lib/Gitter/Client.php:176:        return $this->hidden;
...

Чтобы найти имя files с рекурсивным контуром, содержащим конкретную string используйте команду ниже для UNIX :

find . | xargs grep "searched-string"

для Linux :

grep -r "searched-string" .

найти файл на сервере UNIX

find . -type f -name file_name

найти файл на сервере LINUX

find . -name file_name

Это тот, который работал для моего случая на моей текущей машине (git bash на windows 7):

find ./ -type f -iname "*.cs" -print0 | xargs -0 grep "content pattern"

Я всегда забываю -print0 и -0 для путей с пробелами.

EDIT: теперь мой предпочтительный инструмент вместо ripgrep: https://github.com/BurntSushi/ripgrep/releases . Это очень быстро и имеет лучшие значения по умолчанию (например, рекурсивные по умолчанию). Тот же пример, что и мой первоначальный ответ, но с использованием ripgrep: rg -g "*.cs" "content pattern"


Я думаю, это то, что вы пытаетесь написать

grep myText $(find .)

и это может быть что-то еще полезно, если вы хотите найти файлы grep hit

grep myText $(find .) | cut -d : -f 1 | sort | uniq

grep -r "texthere" . (период уведомления в конце)

(^ кредит: https://.com/a/1987928/1438029 )

Разъяснение:

grep -r "texthere" / (рекурсивно grep все каталоги и подкаталоги)

grep -r "texthere" . (рекурсивно grep эти каталоги и подкаталоги)

grep рекурсивный

grep [options] PATTERN [FILE...]

[опции]

-R, -r, --recursive

Прочитайте все файлы в каждом каталоге, рекурсивно.

Это эквивалентно опции -d recurse или --directories=recurse .

http://linuxcommand.org/man_pages/grep1.html

Помощь grep

$ grep --help

$ grep --help |grep recursive
  -r, --recursive           like --directories=recurse
  -R, --dereference-recursive

альтернативы

ack ( ack )

ag ( github.com/ggreer/the_silver_searcher )


The syntax is:
cd /path/to/dir
grep -r <"serch_word name"> .




grep