Classificando pastas no Unix começando com o segundo caractere

Classificando pastas no Unix começando com o segundo caractere

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] -k2mas 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.Cpara 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 sorttrabalhando 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 -rC1imprime seus argumentos raw no 1 Column
  • *(qualifiers): glob com qualificadores glob
  • N: Nullglob: expande para nada se não houver correspondência
  • /: selecione apenas arquivos do tipodiretório
  • oe[expression]: oordene a lista com base no resultado da expressão (do valor que $REPLYconté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, csmithclassifique nessa ordem, em vez de aleatoriamente.

informação relacionada