The Unix philosophy encourages tiny, composable tools, and Linux distributions preserve decades of legacy commands. There are multiple commands that do the same job, often with identical flags, sometimes with wildly different syntax, all coexisting forever because nothing can be deprecated. Linux inherits 50 years of overlapping tools, and nobody has the authority to remove any of them.
You get three ways to list files, four ways to print text, five ways to search, six ways to edit streams, and ten ways to check system info; all valid, all canonical, all mutually incompatible.
Multiple commands for the same basic action
- List files:
ls,find,stat,tree,exa,fd - Print text:
echo,printf,cat,sed -n,awk '{print}' - Copy files:
cp,rsync,install,dd,tar cf - | tar xf - - Move files:
mv,rsync --remove-source-files,rename,mmv - Delete files:
rm,unlink,find -delete,shred,wipe
Redundant text-processing tools
- grep — search text
- egrep — grep with extended regex
- fgrep — grep without regex
- awk — search + print + transform
- sed — search + replace + stream edit
- perl -ne — search + replace + scripting
- ripgrep (rg) — grep but faster
- ag — grep but faster before ripgrep
- ack — grep but for developers
- find + grep — grep but worse
- grep -R — find but worse
All of these can search text. All of these have different syntax. All of these are still installed.
Redundant file search commands
findlocatewhereiswhichtypecommand -vfdripgrep(yes, people use it as a file finder)
Each solves a slightly different problem, but users treat them interchangeably.
Redundant system information commands
- Disk usage:
df,du,ls -lh,stat,ncdu,dust - Processes:
ps,top,htop,atop,glances - Network:
ifconfig,ip,ss,netstat,nmcli,iw,iwconfig - Hardware:
lspci,lsusb,lsblk,blkid,inxi
Redundant package management
apt,apt-get,apt-cache,dpkgyum,dnf,rpmpacman,yay,parusnap,flatpak,appimage
This isn’t just redundancy; it's fragmentation masquerading as choice.
Redundant scripting constructs
- Conditionals:
[ ],[[ ]],test,(( )) - Subshells:
$( ), ``` - Variable assignment:
var=value,declare,typeset,local - Loops:
for,while,until,seq | while read,xargs -n1
Half of these exist because Bash absorbed features from:
- sh
- ksh
- zsh
- POSIX
- GNU extensions
-And never removed anything!
No central authority is why! Nobody can say "this command is deprecated." So, nothing ever dies. Even if they could, a lot of these may be Rust-rewrites with BSD or MIT license that the cult objects to. GNU Holds Linux Back (Directly)
Every few years someone writes grep but faster, ls but prettier, find but sane, and cat but with syntax highlighting. Debian, Arch, Fedora, Alpine; all ship different defaults.
Linux doesn’t have one way to do things; it has every way except the simple one.