Desafio do Powershell

8

Eu fui desafiado por um amigo para fazer o seguinte:

"Encontre a maneira mais rápida e fácil de classificar uma listagem de diretório pelo caractere ÚLTIMO 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.

    
por Richard 04.12.2009 / 10:20

6 respostas

3
Infelizmente, o Powershell não tem um método fácil e reverso, então você tem que pegar a última letra da string e classificar por ela. Esta é uma maneira que eu fiz:

dir| sort {$_.name.Substring($_.name.length-1)}

Como já foi dito, isso será ordenado estritamente apenas pela última letra, enquanto que eu a versão do Linux irá ordenar pelas últimas e subsequentes letras, então pode haver uma maneira melhor de fazer isso, ou você pode ter que introduza algum loop se você quiser assim.

    
por 04.12.2009 / 11:23
8

dir | sort {$ _. name [-1]}

    
por 05.12.2009 / 19:09
2
dir | sort -Property @{Expression ={$n = $_.Name.ToCharArray(); [Array]::Reverse($n);[String]::Join("",$n)}}

Não tão curta quanto a versão unix, principalmente porque não há uma função String.Reverse () no .NET Framework. Basicamente isso funciona dizendo ordenação ao computar essa expressão nos argumentos de entrada '.

Agora, se qualquer shell unix for melhor que

dir | sort -Property Length -Descending

para imprimir todos os arquivos com o maior primeiro, eu estaria interessado em vê-lo.

    
por 05.12.2009 / 18:05
2

Tenho certeza de que alguém pode fazer isso melhor, mas aqui está uma maneira totalmente compatível com o lynix. Ele tem a vantagem de deixar você com uma função de string rev reutilizável para sua caixa de ferramentas, ou seja, ela classifica toda a sequência e não apenas o último caractere:

function rev ($s) {return -join ($s[$s.Length..0])}

dir | foreach{rev($_.name)} | sort | foreach{rev($_)}

Acho que o foreach está aqui para demonstrar como os pipes do PowerShell são matrizes e não simplesmente strings como no * nix.

Demorei um pouco para perceber que eu tinha que usar apenas $_ e não $_.name dentro do segundo foreach . Então aprendi algo sobre variações no conteúdo da matriz de um pipe para o próximo.

* O crédito para a coragem da minha função rev vai para o link

Funciona como o lynix:

  • dir | sort -Property @ {Expression = {$ n = $ _. Name.ToCharArray (); [Array] :: Reverse ($ n); [String] :: Join ("", $ n)}}

Organiza trabalhos como o lynix, mas muito, muito lento:

  • ls -n | sort {$ _ [3e3..0]}

Não funciona como lynix, , ou seja, falha ao classificar todos os caracteres dos nomes dos arquivos; (apenas ordena o último caractere da string):

  • dir | sort {$ .name.Substring ($ .name.length-1)}
  • dir | classificar {$ _. name [-1]}
  • ls | sort {$ _. Name [-1]}
  • ls | sort {"$ _" [- 1]}
  • ls -n | sort {$ _ [- 1]}
por 18.01.2014 / 05:44
1

A variante de Shay é muito mais curta do que a resposta aceita ao indexar 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:

ls|sort{$_.Name[-1]}

Você também pode usar o argumento (abreviado) -Name para Get-ChildItem :

ls -n|sort{$_[-1]}

que retornará strings diretamente.

Se você realmente quiser classificar pela sequência reversa , o seguinte funciona (mas é lento):

ls -n|sort{$_[3e3..0]}

Você pode torná-lo mais rápido se tiver um limite superior na extensão do nome do arquivo.

    
por 06.12.2009 / 15:49
-1
ls|sort{"$_"[-1]}
    
por 09.12.2009 / 21:57

Tags