一位朋友向我提出了以下挑战:
“找到按文件名的最后一个字符对目录列表进行排序的最快捷、最简单的方法。”
他在 Linux 上使用以下命令完成了此操作:
ls | rev | sort | rev
我想向他展示 powershell 替代方案,但我才刚刚开始学习 powershell,我做不到。所以,我偷懒了,请求你的帮助。
答案1
不幸的是,Powershell 没有一个很好的简单反向方法,所以你必须获取字符串的最后一个字母并按此排序。这是我做过的一种方法:
dir| sort {$_.name.Substring($_.name.length-1)}
正如已经指出的那样,这将严格按最后一个字母排序,而我的 Linux 版本将按最后一个字母然后按后续字母排序,因此可能有更好的方法来做到这一点,或者如果你想要那样的话,你可能必须引入一些循环。
答案2
您可以尝试以下操作:
dir| sort {$_.name[-1]}
答案3
dir | sort -Property @{Expression ={$n = $_.Name.ToCharArray(); [Array]::Reverse($n);[String]::Join("",$n)}}
不像 unix 版本那么短,主要是因为 .NET Framework 中没有 String.Reverse() 函数。基本上,它通过告诉 sort“通过计算输入参数上的这个表达式进行排序”来实现。
现在,如果有任何 unix shell 比
dir | sort -Property Length -Descending
首先打印所有文件,其中最大的一个,我很有兴趣看看。
答案4
谢伊的变体通过索引字符串,比可接受的答案短得多,但即使这样也可以改进。您可以通过排除不必要的空格并使用更短的别名来进一步缩短它:
ls|sort{$_.Name[-1]}
您还可以使用(缩写)-Name
参数来Get-ChildItem
:
ls -n|sort{$_[-1]}
它将直接返回字符串。
如果你真的想按撤销字符串,则以下工作有效(但很慢):
ls -n|sort{$_[3e3..0]}
如果文件名的长度有上限,则可以加快速度。