Estou tentando classificar a listagem de diretórios começando com o segundo caractere.
Por exemplo, se eu fizer o código abaixo, a listagem dos diretórios ficará em ordem com base no primeiro caractere.
$ ls -1d */
lrodriguez/
mreynolds/
yalberto/
O que quero realizar é exibi-los como:
yalberto/
mreynolds/
lrodriguez/
Eu olhei no seguinte fórum: Como classificar arquivos por parte do nome do arquivo? mas não teve sucesso.
Eu tentei algo como: ls -1d -- *?[a-z]* | sort -t?[a-z] -k2
mas não obtive nenhum resultado. Muito novo no ambiente Unix e qualquer indicação será muito útil. Agradeço antecipadamente.
Responder1
Com sort
, você pode usar uma chave do formulário F.C
para especificar a posição do caracteredentro deum campo. Então por exemplo
$ printf '%s\n' */ | sort -k1.2
yalberto/
mreynolds/
lrodriguez/
Observe que isso falhará se algum dos nomes de diretório contiver uma nova linha.
Isso poderia ser contornado com o GNU sort
trabalhando com registros delimitados por NUL em vez de:
printf '%s\0' */ | sort -zk1.2 | tr '\0' '\n'
Observe também que a expansão de */
também inclui links simbólicos para diretórios.
Responder2
Com zsh
:
print -rC1 -- *(N/oe['REPLY=${REPLY#?}'])
print -rC1
imprime seus argumentosr
aw no1
C
olumn*(qualifiers)
: glob com qualificadores globN
:N
ullglob: expande para nada se não houver correspondência/
: selecione apenas arquivos do tipodiretóriooe[expression]
:o
ordene a lista com base no resultado dae
xpressão (do valor que$REPLY
contém inicialmente o nome do arquivo após ter sido manipulado pela expressão)REPLY=${REPLY#?}
: retire o primeiro caractere do nome do arquivo.
Você também pode adicionar o primeiro caractere no final, como com , REPLY=${REPLY#?}.$REPLY[1]
para que asmith
, bsmith
, csmith
classifique nessa ordem, em vez de aleatoriamente.