Fui desafiado por um amigo a fazer o seguinte:
"Encontre a maneira mais rápida e fácil de classificar uma lista de diretórios pelo último caractere dos nomes de arquivos."
Ele fez isso no Linux usando o seguinte:
ls | rev | sort | rev
Eu gostaria de mostrar a ele a alternativa do PowerShell, mas estou apenas começando a aprender PowerShell e não posso fazê-lo. Então, estou trapaceando e pedindo sua ajuda.
powershell
Richard
fonte
fonte
Respostas:
Infelizmente, o Powershell não possui um método reverso fácil e agradável; portanto, você deve obter a última letra da string e classificá-la. Esta é uma maneira que eu fiz:
Como foi apontado, isso será estritamente classificado apenas pela última letra, enquanto que a versão Linux classificará pela última e depois pelas letras subsequentes, portanto, pode haver uma maneira melhor de fazer isso, ou talvez seja necessário introduzir algumas repetições. se você quiser assim.
fonte
Você pode tentar isso:
fonte
Não é tão curto quanto a versão unix, principalmente porque não há uma função String.Reverse () no .NET Framework. Basicamente, isso funciona dizendo ao tipo 'classificar computando esta expressão nos argumentos de entrada'.
Agora, se qualquer shell unix se sair melhor que
para imprimir todos os arquivos com o maior primeiro, eu estaria interessado em vê-lo.
fonte
Tenho certeza que alguém pode fazer isso melhor, mas aqui está uma maneira de ser totalmente compatível com o lynix. Ele tem o benefício de deixá-lo com uma
rev
função de string reutilizável para sua caixa de ferramentas, ou seja, classifica a string inteira e não apenas o último caractere:Acho que o foreach aqui demonstra bem como os tubos do PowerShell são matrizes e não simplesmente cadeias de caracteres como no * nix.
Demorei um pouco para perceber que eu tinha que usar apenas
$_
e não$_.name
dentro do 2ºforeach
. Então, eu aprendi algo sobre variações no conteúdo da matriz de um canal para o outro.* O crédito pelas tripas da minha função rev vai para http://rosettacode.org/wiki/Reverse_a_string#PowerShell
Funciona como lynix:
Funciona como o lynix, mas muito, muito lento:
Não funcione como o lynix, ou seja , falhe ao classificar todos os caracteres dos nomes dos arquivos; (classifica apenas o último caractere da string):
fonte
ls | rev | sort | rev
completamente válido por conta própria. :-)A variante de Shay é bem menor que a resposta aceita indexando a string, mas mesmo isso pode ser melhorado. Você pode reduzi-lo ainda mais excluindo espaços desnecessários e usando um alias mais curto:
Além disso, você pode usar o
-Name
argumento (abreviado) paraGet-ChildItem
:que retornará as strings diretamente.
Se você realmente deseja classificar pela string reversa , o seguinte funciona (mas é lento):
Você pode torná-lo mais rápido se tiver um limite superior no comprimento do nome do arquivo.
fonte
fonte