我受到一位朋友的挑战,做了以下工作:
“find用文件名的最后一个字符对目录列表进行sorting的最快最简单的方法。”
他使用以下方法在Linux上完成:
ls | rev | sort | rev
我想向他展示powershell的select,但我只是刚刚开始学习powershell,我不能这样做。 所以,我在欺骗,并寻求你的帮助。
不幸的是,Powershell没有一个很好的简单的反向方法,所以你必须得到string的最后一个字母,然后sorting。 这是我做过的一个方法:
dir| sort {$_.name.Substring($_.name.length-1)}
正如已经指出的那样,这只会严格按照最后一个字母sorting,而我的Linux版本将按照最后一个字母和后续字母sorting,因此可能有更好的方法来做到这一点,或者你可能需要引入一些循环如果你想这样。
DIR | sorting{$ _。name [-1]}
dir | sort -Property @{Expression ={$n = $_.Name.ToCharArray(); [Array]::Reverse($n);[String]::Join("",$n)}}
不像Unix版本那么简单,主要是因为.NET Framework中没有String.Reverse()函数。 基本上这是通过告诉sorting“通过在input参数上计算这个expression式来sorting”来工作的。
现在,如果任何Unix的shell比
dir | sort -Property Length -Descending
打印所有最大的文件,我有兴趣看到它。
我相信有人可以做得更好,但是这里有一个与lynix完全兼容的方法。 它的好处是为您的工具箱留下一个可重复使用的revstring函数,即它将整个stringsorting,而不仅仅是最后一个字符:
function rev ($s) {return -join ($s[$s.Length..0])} dir | foreach{rev($_.name)} | sort | foreach{rev($_)}
我认为foreach在这里很好地演示了PowerShellpipe道是如何在数组中而不是在* nix中的简单string。
我花了一点时间才意识到,我不得不在第二个foreach使用$_而不是$_.name foreach 。 所以我从一个pipe道到另一个pipe道学习了一些关于数组内容的变化。
*信用我的revfunction的内容去http://rosettacode.org/wiki/Reverse_a_string#PowerShell
像lynix一样工作:
像lynix一样的工作,但非常非常慢:
不要像lynix那样工作,即不能sorting文件名的所有字符; (只sortingstring的最后一个字符):
Shay的变体比通过索引string而被接受的答案要短,但即使这样也可以改进。 您可以通过排除不必要的空格和使用较短的别名来缩短它:
ls|sort{$_.Name[-1]}
您也可以使用(缩写) -Name参数来Get-ChildItem :
ls -n|sort{$_[-1]}
这将直接返回string。
如果你真的想按反向string进行sorting,那么下面的工作(但是很慢):
ls -n|sort{$_[3e3..0]}
如果文件名的长度有一个上限,则可以使其更快。
ls|sort{"$_"[-1]}