ls
infelizmente não tem uma opção para recuperar atributos de arquivo e exibi-los de maneira arbitrária. Alguns sistemas possuem comandos separados para isso (por exemplo, o GNU tem um comando stat
ou a funcionalidade no GNU find
).
Na maioria dos sistemas modernos, com a maioria dos arquivos, isso deve funcionar:
$ ln -s '/foo/bar -> baz' the-file
$ LC_ALL=C ls -ldn the-file | sed '
1s/^\([^[:blank:]]\{1,\}[[:blank:]]\{1,\}\)\{8\}//'
the-file -> /foo/bar -> baz
Isso funciona removendo os primeiros 8 campos delimitados em branco da primeira linha da saída de ls -l
. Isso deve funcionar, exceto em sistemas onde o gid não é exibido ou os dois primeiros campos são unidos quando há um grande número de links.
Com o GNU stat
:
$ LC_ALL=C stat -c '%N' the-file
'the-file' -> '/foo/bar -> baz'
Com o GNU find
:
$ find the-file -prune \( -type l -printf '%p -> %l\n' -o -printf '%p\n' \)
the-file -> /foo/bar -> baz
Com o stat do FreeBSD / OS / X:
f=the-file
if [ -L "$f" ]; then
stat -f "%N -> %Y" -- "$f"
else
printf '%s\n' "$f"
fi
com zsh
stat:
zmodload zsh/stat
f=the-file
zstat -LH s -- "$f"
printf '%s\n' ${s[link]:-$f}
Muitos sistemas também têm um comando readlink
para obter especificamente o destino de um link:
f=the-file
if [ -L "$f" ]; then
printf '%s -> ' "$f"
readlink -- "$f"
else
printf '%s\n' "$f"
fi