Summary
There’s nothing wrong with the Linux commands you’ve been using for years. They’re familiar, dependable, and usually already installed. But just because they’re familiar doesn’t mean they’re frictionless. I don’t necessarily want to remember a longer command just to find a file, or read a config file without visual cues. And that’s where eza, bat, fd, ripgrep, and zoxide come in. They handle familiar jobs with more convenient defaults. The biggest upgrade in your terminal isn’t novelty. It’s readability, alongside less typing wherever possible. eza makes ls look like it’s been asleep since 1995 A tree view, Git status, and fewer trips into subfolders Plain ls tells you what’s in a directory. Eza gives me more ways to understand how those files fit together, including a built-in tree view, extended metadata, and Git status in long listings. The tree view saves me from opening a directory just to discover what’s inside. Limiting its depth keeps larger projects manageable. For everyday inspection, eza -l —git is another useful combination: file details and Git status share the same listing. That doesn’t replace git status, but it makes a directory listing more informative before I decide what to inspect next. bat is cat with a spine Syntax colors, line numbers, and pipes that stay clean You’d still want to cat when the job is simply concatenating files. When I’m reading a configuration file in the terminal, bat offers syntax highlighting, line numbers, and Git modification markers. It also automatically pages output that won’t fit on one screen. Along with the syntax colors, the line numbers will give you useful reference points. Bat’s normal presentation adds more context too, including a filename header. More importantly, its decorations don’t normally leak into pipelines. When output is redirected, bat defaults to plain file contents. It allows me to enjoy the richer terminal view without treating every pipe as a formatting hazard. fd finds your files without a PhD in find syntax -t f -e yaml beats the incantation you keep googling find is powerful, sure, but its syntax is unnecessarily elaborate, especially when I just want to find simple things like all files of a particular extension. Fd gives that rather frequent task a much simpler expression. For example, if I were looking for all YAML files in a folder, I can just type: fd -t f -e yaml That gives me a full list of YAML files in the active directory and any nested folders. The extension filter itself is easy to remember and -t f restricts results to files. Fd also supports regular expressions, glob patterns, and running commands against search results. The important catch here is search scope. Fd skips hidden files and respects ignore rules by default, so these commands won’t necessarily search identical sets of files. Something like fd -HI will include hidden and ignored entries when I need a broader search. I’d keep find for its advanced expressions rather than pretend I’d implement everything it can do. ripgrep skips the junk you never meant to search Smart defaults, and the -uuu escape hatch for when they bite Ripgrep, invoked as rg, is the replacement that most directly matches how I think about searching code. Start at a given point, search recursively, and leave ignored files out unless I ask otherwise. It also skips hidden and binary files by default. The main improvement is the default search behavior, not a radically different result format. I’ve used —no-heading to keep ripgrep’s output in the same compact layout. It also understands file types. For example: rg -t py ‘TODO’ limits search to Python files. When results aren’t as expected, I check the filtering first, which is easily disabled with the -uuu flag. That convenience needs to remain a conscious choice, especially when investigating hidden configuration files. zoxide remembers the paths you’re too lazy to type Install it once, z your way around forever Zoxide changes navigation itself rather than just its appearance. You will have to install it and add the Bash integration at the end of ~/.bashrc as follows: eval ”$(zoxide init bash)” Once done, it remembers visited directories and lets z jump to the highest-ranked matching location. Once the destination is in its database, you go from having to type out entire file paths to just a single command, and that’s the payoff. You can reach familiar destinations from within your terminal without having to reconstruct the entire path. I’m upgrading my habits, not torching the old commands Keep the classics around for scripts that need them As great as these commands are, I’m not going to blindly alias all five of the classics they replace. These tools have different options and defaults, and some like ripgrep don’t even promise POSIX compatibility. Instead, I’m keeping the originals available and using the modern alternatives selectively. A nicer, interactive terminal doesn’t require rewriting every script or forgetting the commands that have worked perfectly well over decades. As long as you’re intentional about what command you’re using and the situation you’re using it in, you’ll find yourself flying in the terminal without giving up any functionality.