2009-12-04 9 views
9

Sono stato sfidato da un amico a fare quanto segue: "Trovare il modo più semplice e veloce di ordinare un elenco di directory dal carattere ultimo dei nomi di file"File Ordinato per ultimo carattere del nome del file in PowerShell

Lo ha fatto su Linux utilizzando il seguente:

ls | rev | sort | rev 

mi piacerebbe mostrargli la PowerShell alternativa, ma sto appena iniziando a imparare PowerShell e non posso farlo. Quindi, sto imbrogliando e chiedo il tuo aiuto.

+1

Prima che qualcuno vota a migrare a questa domanda, uno sguardo a questo: http: //meta.stackexchange .com/questions/32471/wondering-why-i-was-migrated – raven

risposta

8

Ecco il mio ingresso:

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

e per ottenere patologico:

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

Ho provato il codice in ogni risposta e funzionano tutti, ma questo ha la sintassi più breve. Non riesco a capire se una versione è più veloce delle altre, il che richiederebbe il suo timing su una cartella con molti file. – Bratch

5

Sfortunatamente Powershell non ha un semplice metodo di inversione facile, quindi è necessario ottenere l'ultima lettera della stringa e ordinare per quello. Questo è un modo ce l'ho fatta:

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

Come è stato fatto notare, questo fascicolerà rigorosamente solo l'ultima lettera, mentre io la versione per Linux ordinerà dagli ultimi e poi lettere successive, quindi non c'è potrebbe essere un modo migliore per farlo, o potrebbe essere necessario introdurre del looping se lo si desidera in questo modo.

+0

Questo è fantastico. Non così breve come l'alternativa a Linux, ma comunque abbastanza buono. –

+0

Ho notato che questo è solo l'ultima lettera, a differenza della versione di Linux. Tuttavia, la sfida è stata definita "dal carattere ULTIMO", quindi questa risposta risponde alla domanda, anche se le due soluzioni non sono uguali. –

+0

Hm, non funziona 'sort -Descending 'come alternativa inversa? –

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

Non più breve la versione Unix, soprattutto perché non c'è una funzione String.Reverse() in .NET Framework. Fondamentalmente questo funziona dicendo 'sort' calcolando questa espressione sugli argomenti di input '.


Ora, se uno shell UNIX fa meglio di

dir | sort -Property Length -Descending 

per stampare tutti i file con la più grande prima, sarei interessato a vederlo.

+2

Che ne dici di "ls -S"? – Bryan

+0

Wow! Non sapevo di questo: D Bella :) – AntonioCS

4

dir | ordina {$ _. nome [-1]}

4

Shay's variant è molto più breve della risposta accettata indicizzando nella stringa, ma anche quella può essere migliorata. È possibile ridurre ancora di più, escludendo gli spazi inutili e utilizzando un alias più breve:

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

Inoltre è possibile utilizzare il (abbreviato) -Name argomento di Get-ChildItem:

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

che restituirà direttamente stringhe.

Se davvero si vuole ordinare in base alla stringa inverso, quindi le seguenti opere (ma è lento):

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

si può rendere più veloce se si dispone di un limite superiore sul nome del file di lunghezza .

+0

Perché non puoi semplicemente chiamare $ _. Nome.Lunghezza per ottenere la lunghezza (es. Ls -n | sort {$ _ [$ _. Nome.Lunghezza .. 0]})? – zdan

+0

Potrei, ma perderei i personaggi. – Joey

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