Get zsh today. Give it a spin.
Get zsh today. Give it a spin.
1) Glob qualifiers:
ls *(.)
will only match files, not directories, symlinks etc. ls **/*.jpg(.L-3000000on[1,5]) **/*.png(N)
will match .jpg files in the current and all subdirectories, which are: . files
L-3000000 with "length" (size) under 3MB
on ordering them numerically
[1,5] and only the first five
plus any .png files, if they exist (N = it won't fail if they don't).I have some scripts with expressions this complicated, but day-to-day it's useful for finding empty files (L0) or excluding directories. "man zshexpn" and search "Glob Qualifiers".
2) Glob operators:
ls DSC<100-200>.JPG
matches files with names between DSC100.JPG to DSC200.JPG. setopt extended_glob
ls *.java~*Test*
matches all .java files, except those matching Test*. Same man page, search "Glob Operators".3) Lazy for-loops (single command doesn't require do-done), and taking two variables:
echo "A 1" > tempfile
for i j in $(<tempfile); echo $i $j
4) Parameter expansion. > x=EXAMPLE.jpg
> echo $x:r.png ${x:r:l}.png
EXAMPLE.png example.png
Interactively, shell history seems to be nicer, I use a couple of global aliases (alias -g L='| less'), and the completion system completes everything you can possibly think of, like usernames, hostnames, remote filenames, HTTP URLs, processes (for kill)...Re number 2: That works in plain old Bash too:
ls DSC{100..200}.jpg > touch 1 3
> ls <1-3>
1 3
> ls {1..3}
cannot access 2: no such file or directory
1 3
Nevertheless, that's a useful and more powerful alternative to seq that I didn't know about.Tab completion is extremely powerful. Even serious spelling mistakes are forgiven.
The prompt is Git-aware and this provides a lot of helpful information which saves me from having to query the git cli.
There are also plugins available for completion of other programs such as rake
That's technically true for zsh in cases, but it's far easier to port or add compatibility for zsh than fish.
Today I learned people actually write / use scripts without specifying the interpreter at the top of the script. This is like writing a Ruby script and expecting it to work when calling it with the Python interpreter.