Un amigo me desafió a hacer lo siguiente:
"Encuentre la forma más rápida y fácil de ordenar una lista de directorios por el ÚLTIMO carácter de los nombres de archivo".
Lo ha hecho en Linux usando lo siguiente:
ls | rev | sort | rev
Me gustaría mostrarle la alternativa de PowerShell, pero apenas estoy empezando a aprender PowerShell y no puedo hacerlo. Entonces, estoy engañando y pidiendo tu ayuda.
powershell
Ricardo
fuente
fuente
Respuestas:
Desafortunadamente, Powershell no tiene un método reverso fácil y agradable, por lo que debe obtener la última letra de la cadena y ordenar por eso. Esta es una forma en que lo he hecho:
Como se ha señalado, esto se ordenará estrictamente solo por la última letra, mientras que la versión de Linux se ordenará por la última letra y luego las siguientes, por lo que puede haber una mejor manera de hacerlo, o puede que tenga que introducir algunos bucles si así lo quieres
fuente
Puedes probar esto:
fuente
No es tan corto como la versión unix, principalmente porque no hay una función String.Reverse () en .NET Framework. Básicamente, esto funciona diciéndole a sort 'ordenar calculando esta expresión en los argumentos de entrada'.
Ahora, si algún shell de Unix funciona mejor que
para imprimir todos los archivos con el más grande primero, me interesaría verlo.
fuente
Estoy seguro de que alguien puede hacerlo mejor, pero aquí hay una forma que es totalmente compatible con Lynx. Tiene la ventaja de dejarle una
rev
función de cadena reutilizable para su caja de herramientas, es decir, clasifica toda la cadena y no solo el último carácter:Creo que el foreach aquí demuestra muy bien cómo las tuberías de PowerShell son matrices y no simplemente cadenas como en * nix.
Me tomó un tiempo darme cuenta de que tenía que usar solo
$_
y no$_.name
dentro del segundoforeach
. Así que aprendí algo sobre las variaciones en el contenido de la matriz de una tubería a la siguiente.* El crédito por las agallas de mi función rev va a http://rosettacode.org/wiki/Reverse_a_string#PowerShell
Funciona como lynix:
Algo así como trabajos como lynix, pero muy, muy lento:
No funciona como lynix, es decir , no puede ordenar todos los caracteres de los nombres de archivo; (solo ordena el último carácter de la cadena):
fuente
ls | rev | sort | rev
completamente válido por sí solo. :-)La variante de Shay es mucho más corta que la respuesta aceptada al indexar en la cadena, pero incluso eso se puede mejorar. Puede acortarlo aún más excluyendo espacios innecesarios y utilizando un alias más corto:
También puede usar el
-Name
argumento (abreviado) paraGet-ChildItem
:que devolverá cadenas directamente.
Si realmente desea ordenar por la cadena inversa , entonces lo siguiente funciona (pero es lento):
Puede hacerlo más rápido si tiene un límite superior en la longitud del nombre del archivo.
fuente
fuente