Complementando a resposta do @xeniod (iniciada como um comentário, mas ficou muito longa): de acordo com o requisito original de ordenar diretórios ao contrário e arquivos em ordem alfanumérica:
$ ls -d */* | sort -s -t '/' -k1,1rn -k2,2
Ou, se os arquivos / diretórios tiverem mais de um dígito, por exemplo, em vez de apenas dir1..dir9
, você também terá dir10, dir11, dir101,...
e arquivos file1..file10..file101...
, poderá classificar como "números de versão" usando a opção -V
vs apenas alpha / numeric sort (apenas suportado na classificação GNU):
$ ls -d */* | sort -s -t '/' -k1,1rV -k2,2V
Idealmente, porém, seus diretórios e amp; os arquivos terão alguns caracteres especiais prefixando (ou delimitando) os campos que você deseja classificar como um traço (" -
"), por exemplo, dir-23/file-1.txt
, dir-902/file-203.txt
, etc, para poder classificar apenas nesses campos ( texto não numérico após o número ser ignorado):
$ ls -d */* | sort -s -t- -k2,2nr -k3,3n
Pontos principais:
- adicione vários
-k{begin,end}
para classificar colunas entre delimitadores /
separadamente, por exemplo, classificar primeira coluna como alfanumérica, segunda como inversa numérica, terceira como "números de versão", etc
- Eu adicionei "
-d
" a " ls -d */*
", para que o conteúdo do diretório não seja listado, o que quebrará a classificação, se existirem. Alternativamente, para somente considerar arquivos, poderia usar find */ -maxdepth 1 -type f
em vez de ls
.
- Note que você nem se importa com "/" no seu tipo, o que geralmente é bom. Note que você não pode ter mais de um
-t {delim}
em uma única classificação de qualquer maneira (por exemplo, -t '-' -k... -t '/'...
)