Поиск файлов в командной строке
Когда я впервые начал программировать, я использовал программу с графическим интерфейсом для поиска файлов. я думал
это был отличный инструмент. Он даже поддерживал регулярные выражения, но однажды
начал падать, и я больше не мог на него полагаться. Затем я начал использовать
сочетание инструментов командной строки 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
страницы,
переполнение стекаили же
Учебники по цифровому океану.
Вот некоторые другие инструменты поиска, на которые стоит обратить внимание.