Se hacks sujos forem bem-vindos, os seguintes itens podem se aproximar:
ls -C --color -F -1 | rev | sort | rev
Essencialmente:
-
rev
para obter o último caractere primeiro - , em seguida,
sort
, que agora usará o último caractere primeiro - , em seguida,
rev
novamente para recuperar a linha original
Isso, infelizmente, tem saída de coluna única. Você pode aplicar column
a ele para obter uma saída com várias colunas, mas, devido aos caracteres não imprimíveis, as colunas ficam confusas:
$ ls -C --color -F /proc/self/ -1 | rev | sort -i | rev | column -x
fd/ task/ fdinfo/ attr/ ns/ net/ cwd@
exe@ root@ sched cmdline oom_score oom_score_adj oom_adj
stack syscall mem comm statm wchan environ
mountinfo io pagemap cgroup autogroup coredump_filter clear_refs
maps numa_maps smaps mountstats limits mounts status
stat schedstat cpuset auxv personality
E, claro, isso exige ressalvas:
- sem novas linhas nos nomes de arquivos
- nenhum dos caracteres de marcação
ls
está nos nomes de arquivo
Uma função bash, usando uma combinação de find
, sort
e ls
em si que chega perto:
lsc () (
[[ -z $1 ]] && set .
for path
do
[[ -d $path ]] || { ls -CF --color "$path"; echo; continue; }
(( $# > 1 )) && printf '%s:\n' "$path"
find "$path" -maxdepth 1 -mindepth 1 ! -iname '.*' -printf "%y %pls -C --color -F -1 | rev | sort | rev
" |
while IFS= read -d '' -r entry
do
ftype="${entry:0:1}"
fname="${entry:2}"
[[ $ftype == f && -x $fname ]] && ftype=x
printf "$ftype $fname$ ls -C --color -F /proc/self/ -1 | rev | sort -i | rev | column -x
fd/ task/ fdinfo/ attr/ ns/ net/ cwd@
exe@ root@ sched cmdline oom_score oom_score_adj oom_adj
stack syscall mem comm statm wchan environ
mountinfo io pagemap cgroup autogroup coredump_filter clear_refs
maps numa_maps smaps mountstats limits mounts status
stat schedstat cpuset auxv personality
"
done | sort -z -k1 |
sed -z 's/^. //; s:.*/::' |
xargs -0 bash -c 'cd "$0"; ls -CFUd --color "$@"' "$path"
(( $# > 1 )) && echo
done
)
Usando ls
, a impressão em várias colunas se torna muito mais fácil.