eza, bat và fd-find trên Linux: Bộ ba công cụ hiện đại thay thế ls, cat và find

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

2 giờ sáng. Server production báo lỗi. Mình SSH vào, gõ ls -la /var/log/nginx — màn hình trắng toát, không màu sắc, 50 dòng file log nhìn vào mắt muốn nhòa. Rồi cat access.log để xem nội dung — cũng trắng tinh, không highlight gì cả. Mình tìm file config với find / -name "nginx.conf" 2>/dev/null — đợi 30 giây mới có kết quả, xen lẫn đống lỗi permission…

Cái cảm giác đó chắc nhiều người biết. Không phải lỗi của ls, cat, hay find — chúng vẫn hoạt động tốt. Nhưng chúng được viết từ thập niên 70, và terminal ngày nay đã khác xa rồi.

Sau lần đó mình bắt đầu dùng eza, bat, và fd-find — ba công cụ viết lại từ đầu bằng Rust, giữ nguyên chức năng cũ nhưng thêm màu sắc, tốc độ, và UX tốt hơn hẳn. Bài này mình chia sẻ cách cài và dùng thực tế, không lý thuyết dài dòng.

Vấn đề với ls, cat và find trong môi trường thực tế

Trên con server chạy CentOS 7 cũ của công ty, mình đã phải tối ưu khá nhiều để đạt được performance mong muốn — và một trong những thứ mình làm đầu tiên là thay thế mấy lệnh cơ bản này. Không phải để cho “ngầu” mà thực sự tiết kiệm được kha khá thời gian mỗi ngày.

Cụ thể những điểm đau mình gặp:

  • ls không hiển thị màu theo loại file theo mặc định, không có git status, không có tree view
  • cat dump text ra — không syntax highlight, không line number, không hỗ trợ cuộn khi file dài
  • find cú pháp rườm rà (find . -name "*.py" -not -path "*/node_modules/*"), chậm với thư mục lớn, in lỗi permission lẫn vào kết quả

Khái niệm cốt lõi: Ba công cụ Rust thay thế Unix cổ điển

eza — ls hiện đại

eza là fork tích cực của exa (đã ngừng phát triển), viết bằng Rust. Nó thay thế ls với màu sắc theo loại file (executable, symlink, directory…), hiển thị git status ngay trong danh sách file, tree view built-in, và size human-readable mặc định.

bat — cat có linh hồn

batcat nhưng có syntax highlighting cho 150+ ngôn ngữ, line numbers, git diff tích hợp, và tự động phân trang khi nội dung dài. Cú pháp y hệt cat — chỉ đổi tên lệnh là xong.

fd-find — find không làm bạn khóc

fd (package tên fd-find trên Debian/Ubuntu) là find viết lại: cú pháp đơn giản hơn nhiều, tự bỏ qua .gitignore và thư mục ẩn mặc định, chạy song song nên nhanh hơn rõ rệt, và có màu sắc + Unicode đầy đủ.

Thực hành chi tiết

Cài đặt trên Ubuntu/Debian

# Cài eza
sudo apt update
sudo apt install eza

# Cài bat
sudo apt install bat
# Lưu ý: trên Debian/Ubuntu, lệnh là batcat (tránh xung đột tên)
mkdir -p ~/.local/bin
ln -s /usr/bin/batcat ~/.local/bin/bat

# Cài fd-find
sudo apt install fd-find
# Tương tự, lệnh là fdfind — tạo symlink cho tiện
ln -s $(which fdfind) ~/.local/bin/fd

Cài đặt trên CentOS/RHEL/AlmaLinux

# Tải binary eza từ GitHub release (không cần Rust)
EZA_VERSION="v0.19.0"
curl -Lo /tmp/eza.tar.gz \
  "https://github.com/eza-community/eza/releases/download/${EZA_VERSION}/eza_x86_64-unknown-linux-musl.tar.gz"
tar -xf /tmp/eza.tar.gz -C /tmp
sudo mv /tmp/eza /usr/local/bin/

# Tải binary bat
BAT_VERSION="v0.24.0"
curl -Lo /tmp/bat.tar.gz \
  "https://github.com/sharkdp/bat/releases/download/${BAT_VERSION}/bat-${BAT_VERSION}-x86_64-unknown-linux-musl.tar.gz"
tar -xf /tmp/bat.tar.gz -C /tmp
sudo mv /tmp/bat-*/bat /usr/local/bin/

# Tải binary fd
FD_VERSION="v10.1.0"
curl -Lo /tmp/fd.tar.gz \
  "https://github.com/sharkdp/fd/releases/download/${FD_VERSION}/fd-${FD_VERSION}-x86_64-unknown-linux-musl.tar.gz"
tar -xf /tmp/fd.tar.gz -C /tmp
sudo mv /tmp/fd-*/fd /usr/local/bin/

Ưu điểm của cách cài binary: không cần root nếu để vào ~/.local/bin, và dùng được trên server cũ như CentOS 7 mà không cần cài thêm dependency gì.

Dùng eza thay ls

# Liệt kê file cơ bản (có màu ngay)
eza

# Tương đương ls -la
eza -la

# Long format + git status — cực hữu ích khi làm việc với repo
eza -la --git

# Tree view built-in
eza --tree --level=2

# Tree với long format, bỏ qua thư mục rác
eza --tree --level=3 --ignore-glob="node_modules|.git|__pycache__"

# Sort theo thời gian modified, mới nhất lên đầu
eza -la --sort=modified --reverse

# Nhóm thư mục lên đầu
eza -la --group-directories-first

Thêm alias vào ~/.bashrc hoặc ~/.zshrc:

alias ls='eza --color=auto'
alias ll='eza -la --git --group-directories-first'
alias lt='eza --tree --level=2 --ignore-glob=".git|node_modules"'
alias la='eza -la --group-directories-first'

Dùng bat thay cat

# Xem file với syntax highlighting tự động
bat nginx.conf
bat /etc/ssh/sshd_config
bat app.py

# Xem nhiều file cùng lúc
bat *.py

# Tắt line number và decoration khi cần pipe sang lệnh khác
bat --style=plain nginx.conf

# Chỉ xem một đoạn file (line 10-30)
bat -r 10:30 access.log

# bat làm pager cho man pages — cực đỉnh
export MANPAGER="sh -c 'col -bx | bat -l man -p'"
man nginx

Lần đầu mình dùng bat để đọc Nginx config lúc 2 giờ sáng — highlight màu cho từng directive, số dòng rõ ràng — tìm lỗi nhanh hơn hẳn. Nghe thì nhỏ nhặt nhưng khi mắt mờ và não mệt, màu sắc giúp nhiều lắm.

Cấu hình theme cho bat:

# Xem danh sách theme
bat --list-themes

# Thử theme trước khi chọn
bat --theme=Dracula /etc/nginx/nginx.conf

# Đặt mặc định trong config
mkdir -p ~/.config/bat
echo '--theme="Dracula"' >> ~/.config/bat/config

Dùng fd thay find

# Tìm file theo tên — đơn giản hơn find rất nhiều
fd nginx.conf
fd "*.log"
# find tương đương: find . -name "nginx.conf"

# Tìm trong thư mục cụ thể
fd nginx.conf /etc

# Tìm theo extension
fd -e py           # tất cả file .py
fd -e log /var     # file .log trong /var

# Tìm kể cả file ẩn (mặc định fd bỏ qua)
fd -H ".env"

# Tìm theo type: f=file, d=directory, l=symlink
fd -t f "*.conf" /etc
fd -t d "logs"

# Execute command trên kết quả
fd -e log --older-than 30d /var/log -x rm {}

# Tìm file lớn hơn 100MB
fd -S +100M /var

# Tìm file thay đổi trong 7 ngày qua
fd --changed-within 7d -e conf /etc

Cú pháp fd dùng regex nên fd "access.*log" match được cả access.log lẫn access_error.log trong một lần. find cần glob pattern khác và phức tạp hơn nhiều.

Kết hợp ba công cụ

Sức mạnh thật sự là khi dùng kết hợp:

# Tìm config file thay đổi gần đây, xem nội dung từng file
fd -e conf --changed-within 7d /etc | xargs bat

# Xem structure project, bỏ qua build artifacts
eza --tree --level=3 --ignore-glob="node_modules|__pycache__|.git|dist|build"

# Tìm file Python có TODO, xem nội dung match
fd -e py | xargs grep -l "TODO" | xargs bat

# Tìm log lớn, xem phần cuối với syntax highlight
fd -S +10M -e log /var/log | xargs -I{} bat -r -100: {}

Thiết lập đầy đủ trong shell config

# Thêm vào ~/.bashrc hoặc ~/.zshrc

# eza
alias ls='eza --color=auto'
alias ll='eza -la --git --group-directories-first'
alias lt='eza --tree --level=2 --ignore-glob=".git|node_modules"'
alias la='eza -la --group-directories-first'

# bat
alias cat='bat --style=auto'
alias catp='bat --style=plain'   # plain khi cần pipe
export MANPAGER="sh -c 'col -bx | bat -l man -p'"

# fd (trên Ubuntu/Debian)
alias fd='fdfind'

# Áp dụng ngay
source ~/.bashrc

Kết luận

Ba công cụ này không thay đổi workflow — chúng chỉ làm cho việc hiện tại dễ chịu hơn. eza cho phép nhìn ngay git status của file khi làm việc với repo, bat giúp đọc config và code mà không cần mở editor, fd tìm file nhanh và không cần nhớ cú pháp phức tạp của find.

Cài một lần, alias là xong — không cần học lại bất cứ thứ gì vì interface gần như giống hệt công cụ cũ. Lần sau 2 giờ sáng có incident, ít nhất terminal nhìn còn dễ chịu hơn, và tìm được lỗi nhanh hơn một chút. Đôi khi chỉ cần vậy thôi.

Share: