Com zsh
, use o operador de expansão de parâmetro ${array:#pattern}
:
$ set foo -D -D bar '' $'a\nb'
$ printf '<%s>\n' "${@:#-D}"
<foo>
<bar>
<>
<a
b>
POSIXly:
for i do
[ "$i" = -D ] || set -- "$@" "$i"
shift
done
printf '<%s>\n' "$@"
BTW, você esqueceu as citações, --
e -d
:
ls -ld -- "$@"
Se você quiser ordenar por tempo de modificação, basta usar a opção -t
, aqui com -r
(reverso) para o mais antigo primeiro:
ls -lrtd -- "$@"
Tenha em atenção que, se $ARGS
for uma matriz vazia, listará .
. Então você pode fazer:
[ "$@" -eq 0 ] || ls -lrtd -- "$@"
Para classificar confiavelmente com base na hora do dia, independentemente da data, com zsh
e uma ls
implementação que suporta -U
para não classificar:
zmodload zsh/stat # best in ~/.zshrc
bytime() zstat -LA REPLY -F%T +mtime -- $REPLY
ls --full-time -ldU -- .(e{'reply=("$@")'}o+bytime)
Com shells limitados como bash
, é muito difícil classificar arquivos com base em metadados arbitrários como esse. Novamente, se você tiver acesso a ferramentas GNU recentes, será um pouco mais fácil:
[ "$#" -gt 0 ] && (
export LC_ALL=C
printf '%sperl -MPOSIX -e '
exec qw{ls -ldU --},
map {$_->[1]}
sort {$a->[0] cmp $b->[0]}
map {[strftime("%T", localtime((lstat$_)[9])), $_]}
@ARGV' -- "$@"
' "$@" |
sed -z 's|^-$|./-|' |
xargs -r0 stat --printf '%y\t%n$ set foo -D -D bar '' $'a\nb'
$ printf '<%s>\n' "${@:#-D}"
<foo>
<bar>
<>
<a
b>
' -- |
sort -zk2,2 |
cut -zf 2-
) | xargs -r0 ls -lUd --
Portável (mas ainda usando o não-padrão ls -U
aqui), geralmente é mais fácil recorrer a perl
, como:
for i do
[ "$i" = -D ] || set -- "$@" "$i"
shift
done
printf '<%s>\n' "$@"