In zsh, showLatest 10
is (om[1,10])
at the end of the pattern. These are glob qualifiers; om
sorts by modification time (youngest first) and [1,10]
selects the first 10 matches.
find src -type f -iname \*.py
is print -lr src/**/(#i)*.py(D.)
(you need to run setopt extended_glob
first, put that in your ~/.zshrc
).
The globbing flag .
filters regular files only, D
includes hidden files and files in hidden directories like the find
version would. (#i)
is a globbing flag that makes the remainder of the pattern case-insensitive.
print -lr
prints its arguments, one per line (make that print -lr --
if the first argument may begin with a dash). Combining the two, to get the most recent files:
print -lr src/**/(#i)*.py(D.om[1,10])
which in practice you can shorten to print -lr src/**/*.py(om[1,10])
.
In zsh, you probably won't need this because you can sort the list of files when you get it, at least if they're all coming from a single pattern. Here's a way to implement showLatest
in zsh that works with an arbitrary list of files. Unfortunately, the om
glob qualifier can only be applied to a single pattern, and a single pattern can only match files in a single directory or tree. A trick to bypass this is to use the e
(or +
) glob qualifier to inject an arbitrary list into a match result. Then apply an o
glob qualifier to perform the sorting; built-in qualifiers don't act on the result of the e
/+
rewrite, but custom ones (oe
or o+
) do (as of zsh 5.0.5).
#!/usr/bin/env zsh
zmodload zsh/stat
files=("${(@f)$(<&0)}")
print -lr .(e\''reply=($files)'\'noe\''stat -A REPLY +mtime -- $REPLY'\')