Поиск файлов в командной строке

Когда я впервые начал программировать, я использовал программу с графическим интерфейсом для поиска файлов. я думал
это был отличный инструмент. Он даже поддерживал регулярные выражения, но однажды
начал падать, и я больше не мог на него полагаться. Затем я начал использовать
сочетание инструментов командной строки unix, и они стали моим первым выбором для
поиск файлов. Поиск непосредственно в IDE и Emacs по-прежнему полезен.

Мы рассмотрим, как использовать find а также grep найти файлы.

Найти файлы по имени

Откройте программу командной строки и перейдите в каталог с небольшим количеством файлов.
Выполните следующую команду.

find .

Это рекурсивно распечатает все файлы (каталоги, скрытые файлы,
файлы, символические ссылки и т. д.) в текущем каталоге и подкаталогах. Они
будут показаны как относительные пути. find без аргументов сделает то же самое
вещь.

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

find "$(pwd)"

"$()" означает запустить команду bash внутри и вернуть ее как строку. pwd
возвращает текущий рабочий каталог. Он распечатает все файлы, которые он
находит с абсолютным путем.

Теперь давайте найдем только те файлы, которые имеют .js расширение.

find . -iname "*.js"

-iname фильтрует файлы по предоставленному строковому аргументу и нечувствительна к регистру.
Версия с учетом регистра -name. * является дикой картой. Он потребляет 0 или более
символов, затем сопоставляет строки, которые заканчиваются на .js. Это очень распространено
образец в find.

Что, если мы хотим найти файл, который начинается с i и заканчивается .js а также
между ними могут быть другие символы.

find . -iname "i*.js"

Наконец, мы также можем искать слова в середине имени файла.

find . -iname "*index*"

Это не ограничивает файл каким-либо конкретным расширением. Что бы
запрос выглядит так, если мы хотим найти что-то, что имеет index где-то в названии
и заканчивается расширением .js. Также попробуйте найти файлы, оканчивающиеся на другой
расширение в вашем каталоге.

Поиск файлов по содержимому

grep ищет обычный текст с регулярными выражениями. Он выполняет глобальный поиск
и печатает все строки, которые соответствуют. Это отличный инструмент для поиска содержимого
одного или нескольких файлов. Мы можем выполнить простой поиск в файле со следующим
шаблон grep "regexp" /file/path. Вот пример.

grep "Hello" main.js

Это возвращает любые строки из main.js в котором есть слово Hello в яблочко.

Мы можем сделать его контекстно-независимым, добавив -i.

grep -i "Hello" main.js

Если мы хотим, чтобы он распечатал номер строки, добавьте -n флаг.

grep -n "Hello" main.js

Мы можем искать каталог рекурсивно, добавляя -r флаг. Он будет печатать
из имени файла, где он был найден. Добавить -n отметьте также, если вы хотите
номер строчки.

grep -r "div" src/

Мы даже можем ограничить файлы, которые мы ищем, по расширению.

grep -r --include=*.js "div" src

И мы можем ограничить несколько расширений файлов.

grep -r --include=*.{css,html,js} "div" src

Объединение find и grep

Существует некоторое совпадение в поиске файлов по имени в find а также grep но я
нравится использовать find чтобы отфильтровать имена файлов, затем grep фильтровать
содержимое файла с трубой | оператор. Это хороший способ разделить проблемы
хотя может и не надо.

Первый пример: найдите все файлы javascript, в которых есть «привет».

find . -iname "*.js" | xargs grep -i "hello"

Что такое xargs? Помогает grep оцените строки пути к файлу в фактические
файлы и выполнять grep на каждом файле. В противном случае, если вы не добавите xargs,
grep будет выполнять свои запросы только по именам файлов.

Дополнительные команды поиска

find может исключать скрытые файлы.

find . -not -path "*/\.*"

find также может включать несколько поисковых запросов. Однако это немного больше
многословнее, чем --include=*.{html,js} из grep. -o используется для подключения
запросы.

find . -name "*.html" -o -name "*.js"

find может исключать каталоги из вашего поиска. К сожалению, этот вариант
очень многословно, для каждого варианта нужно добавить -path "./exclude/path" -prune,
а затем соедините его с -o и убедитесь, что запрос заканчивается на -print.

Искать в текущем каталоге, исключая ./node_modules.

find . -path "./node_modules" -prune -o -print

Искать в текущем каталоге, исключая ./node_modules а также ./lib.

find . -path "./node_modules" -prune -o -path "./lib" -prune -o -print

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

find . -name "*.js" | grep -v "node_modules"

Наконец, мы можем объединить несколько вещей, которые мы узнали здесь. Исключать
node_modules и найдите файлы, которые .html или же .js расширение.

find . -name "*.html" -o -name "*.js" -path "./node_modules" -prune -o -print

Учить больше

Я предлагаю вам попробовать несколько запросов самостоятельно и записать их. Чем больше вы
практиковаться, тем легче будет вспомнить синтаксис, но если вы забудете, вы можете
взгляните на то, что у вас было раньше.

Обратный поиск (CTRL-r) — это
отличный способ построить поиск постепенно, выполнив небольшой поиск, запустив его,
затем получить его снова из командной строки и уточнить.

Если есть поисковые запросы, которые вы используете повторно, вы можете создать Баш псевдоним
экономить время.

find а также grep с ними легко начать, но есть много вариантов. К
узнать больше проверить их man страницы,
переполнение стекаили же
Учебники по цифровому океану.

Вот некоторые другие инструменты поиска, на которые стоит обратить внимание.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *