2009-12-04 23 views
9

我一直在挑戰一個朋友做到以下幾點:訂單文件

「查找文件名的最後一個字符排序目錄列表​​的最快和最簡單的方式。」

他用下面的做到了在Linux上:

ls | rev | sort | rev 

我想向他展示了PowerShell的選擇,但我纔剛剛開始學習PowerShell和我不能做到這一點。所以,我在欺騙並尋求你的幫助。

+1

在任何人票對遷移這個問題,看看這個:HTTP://meta.stackexchange .com/questions/32471 /想知道爲什麼我遷移了 – raven 2009-12-10 16:19:53

回答

8

這裏是我的條目:

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

,並獲得病理:

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

我在每個答案中都試過代碼,它們都可以工作,但是這個代碼有最短的語法。我無法確定某個版本是否比其他版本更快,這需要在包含大量文件的文件夾中對其進行計時。 – Bratch 2009-12-11 01:28:40

5

不幸的是,Powershell沒有一個很好的簡單的反向方法,所以你必須得到字符串的最後一個字母並按此排序。這是一個方式,我已經做到了:

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

正如已經指出的那樣,這將嚴格排序只有最後一個字母,而我在Linux版本將通過最後再用的後續字母排序,所以有這可能是一個更好的方法,或者如果你想這樣做,你可能不得不引入一些循環。

+0

這真是太棒了。不像Linux的替代品那麼短,但仍然非常好。 – 2009-12-04 10:29:55

+0

我也注意到,這隻能按最後一個字母排序,與linux版本不同。然而,挑戰是「由最後的性格」表達的,所以這個答案回答了這個問題,即使這兩個解決方案不相同。 – 2009-12-04 10:48:44

+0

嗯,不是'sort-descending'函數作爲反向選擇嗎? – 2014-01-06 23:06:57

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

不一樣短UNIX版本,主要是因爲沒有在.NET Framework中的String.Reverse()函數。基本上這是通過告訴sort'通過在輸入參數上計算這個表達式來排序'來工作的。


現在,如果任何UNIX外殼確實優於

dir | sort -Property Length -Descending 

打印所有與最大的一個第一文件,我很想看到它。

+2

'ls -S'怎麼樣? – Bryan 2009-12-05 17:21:39

+0

哇!不知道這個:D很好的一個:) – AntonioCS 2009-12-05 21:31:48

4

dir |排序{$ _。name [-1]}

4

Shay's variant通過索引字符串的方式比接受的答案短,但即使這樣也可以改進。您可以縮短甚至通過排除不必要的空格和使用更短的別名更多:

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

您也可以使用(略)-Name參數Get-ChildItem

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

這將直接返回字符串。

如果你真的想通過反向串排序,那麼下面的工作(但速度較慢):

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

你可以讓它更快一點,如果你有一個上限的文件名的長度。

+0

爲什麼不能只是調用$ _。Name.Length來獲取長度(即ls -n | sort {$ _ [$ _。Name.Length .. 0]})? – zdan 2009-12-07 21:28:12

+0

我可以,但它會浪費字符。 – Joey 2009-12-08 01:27:53

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