↓ Перейти к основному содержимому

rg и lsd — две замены классики

·668 слов·4 минут·
logo

Если вы часто пользуетесь командами ls и grep (да и сложно представить работу в терминале без них), есть две замены, которые я делаю практически на каждой своей машине, — это переход с grep на ripgrep и с ls на lsd. Обе утилиты устанавливаются через Homebrew, работают сразу из коробки и делают привычные рутинные действия в разы приятнее и нагляднее.

  • rg — сверхбыстрый grep на Rust, который по умолчанию учитывает .gitignore, ищет рекурсивно и подсвечивает найденное цветом.
  • lsd — современный ls с иконками, цветовой индикацией, размером файлов в понятном формате и встроенной поддержкой отображения дерева каталогов (--tree).

При этом ничего не ломается: классические системные grep и ls всегда остаются доступны через \grep и \ls (или command grep), если вдруг потребуется их оригинальное поведение без алиасов.

ripgrep — замена grep
#

ripgrep — это утилита поиска текста, написанная на Rust. Она в разы быстрее стандартного GNU/BSD grep, по умолчанию рекурсивно просматривает все файлы в каталоге, автоматически пропускает всё, что указано в .gitignore, и скрытые директории. Основные флаги совместимы с классическими: -n, -i, -C, -l, -F.

Установка
#

brew install ripgrep

Алиас в .zshrc
#

alias grep='rg'

Примеры использования
#

Поиск по всей папке проекта:

$ rg "pattern" ./project/
./src/main.rs:42:    let pattern = "hello";
./docs/readme.md:17:Смотрите раздел «pattern matching»
./tests/test_utils.rs:8:assert!(matches!(result, Pattern::Found))

С номерами строк (-n):

$ rg -n "TODO" ./src/
./src/handler.rs:15:// TODO: handle timeout
./src/handler.rs:47:// TODO: refactor this
./src/config.rs:3:// TODO: read from env

С выводом контекста вокруг строки (-C 2 — по 2 строки до и после совпадения):

$ rg -C 2 "panic!" ./src/
./src/main.rs-10-fn run() {
./src/main.rs-11-    let opts = parse_args();
./src/main.rs:12:    if opts.verbose { panic!("verbose not implemented"); }
./src/main.rs-13-    start_server(opts);
./src/main.rs-14-}

Только имена файлов с совпадениями (-l):

$ rg -l "TODO" ./src/
./src/handler.rs
./src/config.rs

Фильтрация через конвейер (pipe):

cat server.log | grep "ERROR"

Когда на вход поступает поток (pipe), rg автоматически считывает стандартный ввод (stdin), точно так же, как классический grep.

По умолчанию rg не заходит в служебные папки вроде .git, node_modules и файлы из .gitignore, поэтому поиск происходит моментально. Если вам нужно принудительно искать везде:

  • rg -u (или --no-ignore) — не учитывать .gitignore.
  • rg -uu — не учитывать .gitignore и искать в скрытых файлах (dotfiles).

lsd — замена ls
#

lsd (LSDeluxe) — это ls следующего поколения, где из коробки включено всё то, что в обычном ls приходится вызывать длинными флагами: аккуратная подсветка типов файлов и прав доступа, человекочитаемые размеры (KB, MB), иконки и древовидная структура.

Установка
#

brew install lsd

Совет по иконкам: чтобы иконки отображались корректно (без квадратиков и знаков вопроса), в настройках вашего терминала (iTerm2, Ghostty, Alacritty или стандартный Терминал) должен быть выбран любой шрифт с глифами Nerd Fonts. Например, brew install --cask font-jetbrains-mono-nerd-font.

Примеры использования
#

Базовый компактный вывод:

$ lsd
build/  src/  tests/  Cargo.toml  README.md

Подробный длинный формат (-l):

$ lsd -l
drwxr-xr-x  tatarinovms  staff   128 B  Sun 27 Sep 12:59  build/
drwxr-xr-x  tatarinovms  staff   256 B  Sun 27 Sep 12:59  src/
drwxr-xr-x  tatarinovms  staff   96 B   Sun 27 Sep 12:59  tests/
-rw-r--r--  tatarinovms  staff   4.2 KB Sun 27 Sep 12:59  Cargo.toml
-rw-r--r--  tatarinovms  staff   1.1 KB Sun 27 Sep 12:59  README.md

Дерево каталогов (--tree):

$ lsd --tree
.
├── build/
│   ├── output.bin
│   └── cache/
├── src/
│   ├── main.rs
│   └── lib.rs
├── tests/
│   └── test_main.rs
├── Cargo.toml
└── README.md

Принудительное отображение иконок:

$ lsd --icon always
📁 build/   📁 src/   📁 tests/   📄 Cargo.toml   📋 README.md

Настройка алиасов в .zshrc
#

Чтобы сделать поведение естественным, пропишите алиасы в свой ~/.zshrc:

# ripgrep вместо grep
alias grep='rg'

# lsd вместо ls + удобные сокращения
alias ls='lsd'
alias l='lsd -l'
alias la='lsd -a'
alias lla='lsd -la'
alias lt='lsd --tree'

Примените изменения в текущей сессии:

source ~/.zshrc

Теперь ls и grep работают через современные быстрые утилиты. Если однажды понадобится запустить оригинальные системные утилиты macOS (например, для проверки строгого POSIX-поведения), достаточно поставить перед командой обратный слэш (\grep, \ls) или префикс command (command ls).

Ссылки
#

Related