2009-12-04 15 views
9

He sido desafiado por un amigo a hacer lo siguiente:Archivos Ordenar por último carácter del nombre de archivo en Powershell

"Encontrar la manera más rápida y fácil de clasificar una lista de directorios por el carácter último de los nombres de archivo."

Lo ha hecho en Linux usando el siguiente:

ls | rev | sort | rev 

me gustaría que le muestre la alternativa PowerShell, pero estoy empezando a hacer aprender PowerShell y no puedo hacerlo. Entonces, estoy haciendo trampa y pidiendo tu ayuda.

+1

Antes de que nadie vota para migrar a esta pregunta, echar un vistazo a esto: http: //meta.stackexchange .com/questions/32471/wondering-why-i-was-migrated – raven

Respuesta

8

Aquí está mi entrada:

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

y para obtener patológica:

ls|sort{"$_"[-1]} 
+0

Probé el código en cada respuesta y todas funcionan, pero esta tiene la sintaxis más corta. No puedo decir si una versión es más rápida que las otras, lo que requeriría sincronizarla en una carpeta con muchos archivos. – Bratch

5

Desafortunadamente Powershell no tiene un buen método de inversión fácil, así que en su lugar debe obtener la última letra de la cadena y ordenarla por eso. Esta es una manera de que me he hecho:

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

Como se ha señalado, esto va a clasificar estrictamente sólo la última carta, mientras que la versión para Linux será la clasificación por los últimos y cartas posteriores, por lo que hay puede ser una mejor manera de hacerlo, o puede que tenga que introducir algún bucle si así lo desea.

+0

Eso es genial. No es tan corta como la alternativa de Linux, pero sigue siendo bastante buena. –

+0

También me di cuenta de que esto solo depende de la última letra, a diferencia de la versión de Linux. Sin embargo, el desafío declarado "por el ÚLTIMO carácter" por lo que esta respuesta responde a la pregunta, incluso si las dos soluciones no son iguales. –

+0

Hm, ¿la función 'ordenar -Descendiendo 'no es una alternativa inversa? –

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

No es tan corta como la versión de Unix, sobre todo porque no es una función String.Reverse() en el .NET Framework. Básicamente, esto funciona diciendo sort 'sort calculando esta expresión en los argumentos de entrada'.


Ahora, en su caso shell de Unix hace mejor que

dir | sort -Property Length -Descending 

para imprimir todos los archivos con el más grande primero, me interesaría verlo.

+2

¿Qué tal 'ls -S'? – Bryan

+0

¡Guau! No sabía de esto: D Niza uno :) – AntonioCS

4

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

4

Shay's variant es mucho más corto que la respuesta aceptada indizando en la cadena, pero incluso eso se puede mejorar. Se puede acortar aún más mediante la exclusión de los espacios innecesarios y usar un alias más corto:

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

También se puede utilizar el (abreviado) -Name argumento para Get-ChildItem:

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

que devolverá directamente cuerdas.

Si realmente desea ordenar por la cadena inversa, a continuación, las siguientes obras (pero es lento):

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

Usted puede hacerlo más rápido si tiene un límite superior de la longitud del nombre del archivo .

+0

¿Por qué no puedes simplemente llamar $ _. Name.Length para obtener la longitud (es decir, ls -n | sort {$ _ [$ _. Name.Length .. 0]})? – zdan

+0

Podría, pero desperdiciaría caracteres. – Joey

0
dir|select Name,@{ 
    L="R"; 
    E={[char[]]$R=$_.Name; 
    [system.array]::reverse($R); 
    $R -join($null) 
} 
}|sort R 
Cuestiones relacionadas