Modern Replacements for ls

Replace ls with eza, lsd, or exa for colors, Git status, tree view and richer long listings. Also covers broot, an interactive tree navigator.

Updated

short verdict

Pick eza if you want a maintained ls replacement with Git status, tree view and YAML-configurable colors. Pick lsd if you want icons and documented ls-style aliases, and have a patched font. Use broot when you want to browse and act on a directory tree interactively rather than print a listing.

ls prints names with few defaults for color, Git state or metadata. The tools here add color-coded file types, long views with more columns, and tree output. eza, exa and lsd are direct listing commands you can alias over ls. exa is no longer maintained and points to eza as its fork. broot is a different kind of tool: an interactive tree browser with fuzzy search and file operations.

this page is for

  • Developers who want Git status next to file listings
  • Users who want to alias ls to a colored, icon-aware listing
  • Anyone who runs ls and tree together and wants one interactive view
#1

eza

★ 23.7kRust
details

A Rust listing command with grid, tree and long views, Git status and extended attributes, and the one to pick for a maintained ls replacement.

best for

  • Default ls replacement with Git status
  • Users moving over from exa

strengths

  • Shows Git status indicators in the listing, plus SELinux contexts and mount point details
  • Sorts by size, date or extension, with directory-first grouping and glob-based exclusion
  • Colors are configurable through YAML theme files; relative dates and binary size prefixes are supported
  • Supports terminal hyperlinks and icon display, and recursive listing with depth limiting

weaknesses

  • Icon display depends on a terminal font that includes the glyphs
  • Compatibility is described as covering most ls workflows, not all, so some ls flags may behave differently
#2

lsd

★ 16.3kRust
details

A Rust rewrite of GNU ls with icons, tree view and YAML config files, with documented aliases for ls, tree and ls -la.

best for

  • Users who want file type icons in listings
  • Users who want a ready-made alias set

strengths

  • Documents aliases: alias ls='lsd', alias lt='lsd --tree' and alias lla='lsd -la'
  • Configured through config.yaml, colors.yaml and icons.yaml in the XDG config directory
  • Icons can be overridden by name, by extension or by filetype (directories, executables, symlinks)
  • Available through Homebrew, Cargo and APT

weaknesses

  • Icons need a patched font such as Nerd Font or Font Awesome, or they render wrongly
  • Git status columns are not documented, unlike in eza and exa
#3

exa

★ 24.4k
details

The original ls replacement that eza forked from; it still installs from Homebrew, APT and Cargo, but the project is no longer maintained.

best for

  • Systems where exa is already installed and scripted against

strengths

  • Long view shows modified, accessed and created times, octal permissions, inode numbers and extended attributes
  • Git-aware filtering respects .gitignore; grid, tree and long formats are available
  • Single binary; Git support is optional via libgit2

weaknesses

  • No longer maintained; the project recommends eza instead
  • Lacks the YAML theme files and hyperlink support listed for eza
#4

broot

★ 13.1kRust
details

An interactive tree browser with fuzzy search, Git views and file operations; it replaces ls and tree for navigation, not for printing a listing.

best for

  • Exploring large directories without printing them
  • Moving, copying and deleting files while keeping the tree in view

strengths

  • Fuzzy search, regex search with /pattern and content search with c/pattern
  • Respects .gitignore; :gf shows Git file statuses and :gs shows only Git changes
  • Sorts with --sort-by-size and --sort-by-date; multiple panels allow side-by-side directories
  • Previews files, including images in compatible terminals

weaknesses

  • Interactive program, so it does not fit an alias over ls for piping output
  • Its verbs and search prefixes are a larger vocabulary to learn than ls flags

What changes compared to ls

These differences are documented by the projects.

  • Output is color-coded by file type in eza, exa and lsd; lsd and eza can also show icons
  • eza and exa show Git status in the listing; broot uses :gf and :gs commands for the same
  • eza, exa and lsd (--tree) have a tree view; broot shows a navigable tree as its main view
  • exa's long view adds created and accessed times, octal permissions, inode numbers and extended attributes
  • broot is interactive with fuzzy search and file operations, where ls just prints names

Switching from ls

lsd documents shell aliases you can copy into your shell config. eza is described as compatible with most existing ls workflows.

  • alias ls='lsd' replaces ls with lsd for basic listings
  • alias lt='lsd --tree' adds a tree shortcut
  • alias lla='lsd -la' gives a detailed listing including hidden files
  • Install eza with nix run github:eza-community/eza, or exa with Homebrew, APT or Cargo

When not to use these

  • You need identical ls output in portable scripts across machines: none of these projects document full ls output compatibility.
  • You work on servers where you cannot install binaries; plain ls is already there.

FAQ

Can I use these as drop-in replacements for ls in scripts?
Not documented. lsd says it keeps compatibility with standard ls command patterns and eza says it keeps compatibility with most existing ls workflows, but neither documents identical output for scripts. exa does not document it, and broot is interactive, so it is not a drop-in.
Should I use exa or eza?
Use eza. exa is no longer maintained, and its own project recommends the eza fork. eza lists features exa does not, such as YAML color themes and terminal hyperlinks.
Do I need a special font for icons?
For lsd, yes: it needs a patched font such as Nerd Font or Font Awesome for icons, and it also supports Unicode emojis. eza can display icons too, though its font requirements are not documented.
Does broot replace ls?
It replaces ls and tree for exploring directories, with a tree view, fuzzy search and file operations. It is an interactive program, so it does not replace ls in pipelines.

related