Если я правильно понял ваш вопрос, вы хотите построить две вещи на одном и том же axes
без совместного доступа axis
. Вероятно, есть лучший способ сделать это, но вы можете установить twinx
(doc) и twiny
(doc) как таковые
ax # your first axes
ax_new = ax.twinx().twiny()
Который даст вам отметки по всем сторонам сюжета. ax
будет зависеть от нижней и левой сторон, ax_new
будет зависеть от верхнего и правого.
Выполните следующие действия:
grep -rnw '/path/to/somewhere/' -e 'pattern'
-r
или -R
рекурсивно, -n
- номер строки, а -w
означает совпадение всего слова. -l
(нижний регистр L) можно добавить, чтобы просто указать имя файла совпадающих файлов. Наряду с этим, --exclude
, --include
, --exclude-dir
могут использоваться для эффективного поиска:
grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
--exclude-dir
. Например, это исключает dirs dir1 /, dir2 / и все из них, соответствующие * .dst /: grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
. Это очень хорошо работает для меня, для достижения почти той же цели как ваш.
Для получения дополнительных опций проверьте man grep
.
Ниже приведен список команд, которые можно использовать для поиска файла.
grep "text string to search” directory-path
grep [option] "text string to search” directory-path
grep -r "text string to search” directory-path
grep -r -H "text string to search” directory-path
egrep -R "word-1|word-2” directory-path
egrep -w -R "word-1|word-2” directory-path
egrep
эквивалентен grep -E
, а это означает --extended-regexp
, здесь вы можете найти подробности unix.stackexchange.com/a/17951/196072
– omerhakanbilici
25 July 2018 в 11:00
Как найти все файлы, содержащие определенный текст в Linux? (...)
Я встретил это решение дважды:
blockquote>
find / -type f -exec grep -H 'text-to-find-here' {} \;
Если вы используете find , как в вашем примере, лучше добавьте
-s
(--no-messages
) вgrep
и2>/dev/null
в конце команды, чтобы избежать большого количества сообщений g8] Permission denied , выпущенныхgrep
иfind
:find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null
find - стандартный инструмент для поиска файлов - в сочетании с grep при поиске определенного текста - на Unix-подобных платформах. Команда find часто сочетается с xargs , между прочим.
Быстрые и простые инструменты существуют с той же целью - см. Ниже. Лучше попробуйте их, , если они доступны на вашей платформе , конечно:
Более быстрые и простые альтернативы
RipGrep - самый быстрый инструмент поиска вокруг:
rg 'text-to-find-here' / -l
ag 'text-to-find-here' / -l
ack :
ack 'text-to-find-here' / -l
Примечание: вы также можете добавить
2>/dev/null
к этим командам, чтобы скрыть много сообщений об ошибках.
Предупреждение: , если вы действительно не можете этого избежать, 't искать из ' / '(корневой каталог) , чтобы избежать длительного и неэффективного поиска! Поэтому в приведенных выше примерах вам лучше заменить '/' на имя подкаталога, например. «/ home» в зависимости от того, где вы действительно хотите искать ...
grep
find
не выполняет прямой поиск внутри файлов для текста. И, возможно, эти дополнительные инструменты полезны для некоторых, но старых таймеров, и те, кто хорошо привыкли к, например, grep
i> не дал бы им вообще никакого времени (ну я, конечно, не буду). Не сказать, что они бесполезны.
– Pryftan
1 May 2018 в 23:36
Существует инструмент ack
, который будет делать именно то, что вы ищете.
http://linux.die.net/man/1/ack
ack -i search_string folder_path/*
Вы можете игнорировать -i
для поиска с учетом регистра
Если у вас есть набор файлов, которые вы всегда будете проверять, вы можете псевдонимы их путей, например:
alias fd='find . -type f -regex ".*\.\(inc\|info\|module\|php\|test\|install\|uninstall\)"'
Затем вы можете просто отфильтровать список следующим образом:
grep -U -l $'\015' $(fd)
Отфильтровывает список fd для файлов, содержащих шаблон CR.
Я нахожу, что наложение файлов, которые меня интересуют, помогает мне создавать более простые скрипты, а затем всегда пытается вспомнить, как получить все эти файлы. Рекурсивный материал работает, но рано или поздно вам придется бороться с отсечением определенных типов файлов. Именно поэтому я просто нахожу все типы файлов, которые мне интересны для начала.
grep -insr "pattern" *
i
: игнорировать различия в событиях как в PATTERN, так и в входных файлах. n
: префикс каждой строки вывода с номером строки на основе 1 в его входной файл. s
: Подавлять сообщения об ошибках о несуществующих или нечитаемых файлах. r
: рекурсивно читать все файлы под каждым каталогом. Вы можете использовать grep -ilR
:
grep -Ril "text-to-find-here" /
i
означает случай игнорирования (необязательно в вашем случае). R
означает рекурсивный. l
означает «показать имя файла, а не сам результат». /
означает начало в корне вашей машины. -i
заставляет его замедлять много, поэтому не используйте его, если это не необходимо. Протестируйте его в определенном каталоге, а затем обобщите. Он должен быть завершен в течение нескольких минут. Я думаю, что регулярное выражение сделает его медленнее. Но мои комментарии основаны на предположениях, я предлагаю вам проверить его с помощью time
перед линией.
– fedorqui
6 June 2013 в 09:14
/*
означает это. В любом случае, я просто протестировал его и заметил, что работает только /
.
– fedorqui
6 June 2013 в 09:15
fgrep is the same as grep -F -> Interpret PATTERN as a list of fixed strings
.
– fedorqui
30 September 2013 в 09:23
grep -Ril "text-to-find-here" ~/sites/
или использовать. для текущего каталога grep -Ril "text-to-find-here" .
– Black
28 January 2016 в 13:19
grep -Erni + "text you wanna search"
Команда будет искать рекурсивно во всех файлах и каталогах текущего каталога и печатать результат.
Примечание: если ваш выход grep не окрашен, вы можете изменить его, используя grep = 'grep --color = always' alias в вашем файле src оболочки
-i
i> делает поиск нечувствительным к регистру; по умолчанию у него нет этого - и не должно быть, поскольку Unix (и т. д.) не является регистро-независимой ОС. Вы также можете указать, для чего нужны другие параметры.
– Pryftan
2 June 2018 в 01:31
find /path -type f -exec grep -l "string" {} \;
Объяснение из комментариев
find - это команда, которая позволяет находить файлы и другие объекты, такие как каталоги и ссылки в подкаталогах заданного пути. Если вы не укажете маску, с которой должны встречаться имена файлов, она перечисляет все объекты каталога.
-type f specifies that it should proceed only files, not directories etc.
-exec grep specifies that for every found file, it should run grep command, passing its filename as an argument to it, by replacing {} with the filename
Избегайте хлопот и устанавливайте ack-grep. Это устраняет много разрешений и котировок.
apt-get install ack-grep
Затем перейдите в каталог, который вы хотите найти, и выполните команду ниже
cd /
ack-grep "find my keyword"
Попробуйте:
find / -type f -exec grep -H 'text-to-find-here' {} \;
, который будет искать все файловые системы, потому что /
является корневой папкой.
Для использования домашней папки:
find ~/ -type f -exec grep -H 'text-to-find-here' {} \;
Для использования текущей папки:
find ./ -type f -exec grep -H 'text-to-find-here' {} \;
xargs
, как это .. подумайте об этом. echo "file bar.txt has bar" > bar.txt; echo "file foo bar.txt has foo bar" > "foo bar.txt"; echo "You should never see this foo" > foo; find . -name "*.txt" | xargs grep -i foo # ./foo:You should never see this foo
. Здесь xargs
соответствовал файлу WRONG и НЕ соответствовал предполагаемому файлу. Либо используйте find .. -print0 | xargs -0 ...
, но это бесполезное использование трубы или лучше find ... -exec grep ... {} +
– shalomb
11 October 2016 в 20:10
Прежде всего, я считаю, что вы использовали -H
вместо -l
.
find / -type f -exec grep -l "text-to-find-here" {} \;
Предположим, вы ищете файлы, содержащие определенный текст «Apache License» внутри вашего каталога ,
bash-4.1$ find . -type f -exec grep -l "Apache License" {} \;
./net/java/jvnet-parent/5/jvnet-parent-5.pom
./commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.pom
./io/swagger/swagger-project/1.5.10/swagger-project-1.5.10.pom
./io/netty/netty-transport/4.1.7.Final/netty-transport-4.1.7.Final.pom
./commons-codec/commons-codec/1.9/commons-codec-1.9.pom
./commons-io/commons-io/2.4/commons-io-2.4.pom
bash-4.1$
Даже если вы не используете случай, подобный тому, который указан ниже (вывод будет отличаться в зависимости от вашего содержимого каталога). «text» vs «TEXT», вы можете использовать переключатель -i
, чтобы игнорировать регистр. Подробнее вы можете прочитать здесь .
Надеюсь, это вам поможет.
find
передаст все пути, которые он обнаружит, к команде grep -l "text-to-find-here" <file found>"
. Вы можете добавить ограничения на имя файла, например. find / -iname "*.txt"
для поиска только в файлах, имя которых заканчивается на .txt
– Mene
20 April 2017 в 13:46
-iname
i> нечувствителен к регистру, что означает, что он также найдет файлы .TXT, а также TxT и TXt и так далее.
– Pryftan
1 May 2018 в 23:04
Используйте pwd
для поиска из любого каталога, в котором вы находитесь, рекурсия вниз
grep -rnw `pwd` -e "pattern"
Обновление. В зависимости от используемой вами версии grep вы можете опустить pwd
. В более новых версиях .
, по-видимому, является аргументом по умолчанию для grep, если каталог не указан таким образом:
grep -rnw -e "pattern"
или
grep -rnw "pattern"
будет делать то же, что и выше!
pwd
вообще не требуется, поскольку оно является значением по умолчанию. grep -rnw "pattern"
.
– fedorqui
2 December 2016 в 14:17
grep -rnw
и тому подобное было отвечено, как три года назад, я не вижу, как этот ответ добавляет ценность.
– fedorqui
2 December 2016 в 15:03
grep -rnw '/path/to/somewhere/' -e "pattern"
, что и есть здесь. 5 голосов после посещений 2.3M это не так много.
– fedorqui
14 December 2016 в 09:45
Меня увлекает то, как простой grep делает это с помощью 'rl'
grep -rl 'pattern_to_find' /path/where/to/find
-r to find recursively file / directory inside directories..
-l to list files matching the 'pattern'
Используйте '-r' без 'l', чтобы увидеть имена файлов, за которыми следует текст, в котором шаблон
blockquote>grep -r 'pattern_to_find' /path/where/to/find
Работает просто отлично ..
Надеюсь, что это поможет!
Нижеприведенная команда отлично подходит для этого подхода:
find ./ -name "file_pattern_name" -exec grep -r "pattern" {} \;
find
, а затем grep -r
? Они предназначены для одного и того же, поэтому это избыточно.
– fedorqui
23 December 2015 в 18:02
ls
или find
(для рекурсивного)
– fedorqui
2 December 2016 в 14:15
find
.
– fedorqui
4 December 2016 в 00:00
-name '*.*'
не то, что вы говорите; он не забирает файл под названием «файл», потому что шаблон не соответствует этому (нет .ext); *
, однако (в порядке). Но есть еще одна вещь: если вы хотите, чтобы все файлы, зачем нужно указывать имя файла в первую очередь? Никаких других комментариев - кроме того, что приятно знать, что все еще есть люди, которые не используют папку MS терминологии (которая действительно после того, как я сказал это достаточно, я бы не добавил, но я хотел бы указать немного неправильное заявление, которое вы сделали с именами файлов, а также избыточность / бесполезность в случае «всего»).
– Pryftan
1 May 2018 в 23:25
grep - ваш хороший друг для достижения этого.
grep -r <text_fo_find> <directory>
, если вам не нужен случай поиска текста, используйте
grep -ir <text_to_find> <directory>
-
i> s, вам нужно сначала передать --
i> в grep; что может вызвать интересные побочные эффекты в противном случае!
– Pryftan
2 June 2018 в 00:25
Вы можете использовать ack . Это похоже на grep для исходного кода.
Просто выполните:
ack 'text-to-find-here'
В корневом каталоге.
Вы также можете использовать regular выражения , укажите тип файла и т. д.
UPDATE
Я только что открыл Silver Searcher , который похож на ack, но 3 -5x быстрее, чем он, и даже игнорирует шаблоны из файла .gitignore
.
Если ваш grep
не поддерживает рекурсивный поиск, вы можете комбинировать find
с xargs
:
find / -type f | xargs grep 'text-to-find-here'
Мне это легче запомнить, чем формат для find -exec
.
Это приведет к отображению имени файла и содержимого соответствующей строки, например
/home/rob/file:text-to-find-here
Дополнительные флаги, которые вы можете добавить к grep
:
-i
- нечувствительный к регистру поиск -l
- выводит только имя файла, в котором было найдено совпадение -h
- выводить только строку, которая соответствует (не filename) grep 'text-to-find-here'
без имени файла, если find
ничего не находит. Это будет зависать и ждать ввода пользователя! Добавьте --no-run-if-empty
в качестве опции в xargs
.
– hagello
28 January 2016 в 06:46
find … -exec grep … +
. Если вы настаиваете на использовании find вместе с xargs, используйте -print0
и -0
.
– hagello
28 January 2016 в 06:50
Вы можете использовать это:
grep -inr "Text" folder/to/be/searched/
Для поиска строки и вывода этой строки с помощью строки поиска:
for i in $(find /path/of/target/directory -type f); do grep -i "the string to look for" "$i"; done
например:
for i in $(find /usr/share/applications -type f); \
do grep -i "web browser" "$i"; done
Чтобы отобразить имя файла, содержащее строку поиска:
for i in $(find /path/of/target/directory -type f); do if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;
, например:
for i in $(find /usr/share/applications -type f); \
do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
fi; done;
find … -exec grep 'str' {} \;
(если вам вообще нужно использовать find
).
– phk
7 October 2016 в 16:14
find
, содержал пробелы .. вы могли бы закончить grepping
неправильные файлы и / или пропустить нужные файлы в целом. Просто используйте find ... -exec grep ...
, если вам нужно использовать find
.., но в этом случае достаточно grep -r ...
.
– shalomb
11 October 2016 в 20:19
Вы можете использовать:
grep -r "string to be searched" /path/to/dir
r
означает рекурсивный поиск, поэтому он будет искать в указанном пути, а также в его подкаталогах. Это скажет вам имя файла, а также распечатает строку в файле, где отображается строка.
Или команда, аналогичная той, которую вы пытаетесь (пример:) для поиска во всех файлах javascript ( * .js):
find . -name '*.js' -exec grep -i 'string to search for' {} \; -print
Это будет печатать строки в файлах, где отображается текст, но не печатает имя файла.
В дополнение к этой команде, мы также можем написать это: grep -rn «String to search» / path / to / directory / or / file -r: рекурсивный поиск n: номер строки будет отображаться для совпадений
Попробуйте:
find . -name "*.txt" | xargs grep -i "text_pattern"
xargs
, как это .. подумайте об этом. echo "file bar.txt has bar" > bar.txt; echo "file foo bar.txt has foo bar" > "foo bar.txt"; echo "You should never see this foo" > foo; find . -name "*.txt" | xargs grep -i foo # ./foo:You should never see this foo
. Здесь xargs
соответствовал файлу WRONG и НЕ соответствовал предполагаемому файлу. Либо используйте find .. -print0 | xargs -0 ...
, но это бесполезное использование трубы или лучше find ... -exec grep ... {} +
– shalomb
11 October 2016 в 20:10
Использование:
grep -c Your_Pattern *
Это сообщит, сколько копий вашего шаблона присутствует в каждом из файлов в текущем каталоге.
ls
или find
(для рекурсивного)
– fedorqui
2 December 2016 в 14:15
-name '*.*'
не то, что вы говорите; он не забирает файл под названием «файл», потому что шаблон не соответствует этому (нет .ext); *
, однако (в порядке). Но есть еще одна вещь: если вы хотите, чтобы все файлы, зачем нужно указывать имя файла в первую очередь? Никаких других комментариев - кроме того, что приятно знать, что все еще есть люди, которые не используют папку MS терминологии (которая действительно после того, как я сказал это достаточно, я бы не добавил, но я хотел бы указать немного неправильное заявление, которое вы сделали с именами файлов, а также избыточность / бесполезность в случае «всего»).
– Pryftan
1 May 2018 в 23:25
r
ленив (проходит сначала по глубине, чем останавливается после первого каталога), аR
- жадный (правильно пересекает все дерево). – Eliran Malka 24 March 2015 в 16:09R
rur
будет правильно перемещать каталоги, ноR
будет следовать символическим ссылкам. – bzeaman 5 July 2016 в 08:36