我受到一位朋友的挑战,请执行以下操作:
“找到通过文件名的LAST字符对目录列表进行排序的最快,最简单的方法。”
他使用以下方法在Linux上完成了此操作:
ls | rev | sort | rev
我想向他展示powershell的替代方案,但是我只是开始学习powershell而我做不到。所以,我在作弊并寻求您的帮助。
我受到一位朋友的挑战,请执行以下操作:
“找到通过文件名的LAST字符对目录列表进行排序的最快,最简单的方法。”
他使用以下方法在Linux上完成了此操作:
ls | rev | sort | rev
我想向他展示powershell的替代方案,但是我只是开始学习powershell而我做不到。所以,我在作弊并寻求您的帮助。
Answers:
不幸的是,Powershell并没有一个很好的简单反向方法,因此您必须获取字符串的最后一个字母并以此排序。这是我做到的一种方式:
dir| sort {$_.name.Substring($_.name.length-1)}
正如已经指出的那样,这将仅按最后一个字母进行排序,而我的Linux版本将按最后一个以及随后的字母进行排序,因此可能有更好的方法,或者您可能需要引入一些循环如果您想要那样的话。
您可以尝试以下方法:
dir| sort {$_.name[-1]}
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
要首先打印最大的所有文件,我很想看到它。
我确定有人可以做得更好,但这是一种与lynix完全兼容的方法。它的好处是rev
为您的工具箱提供了可重复使用的字符串函数,即,它对整个字符串进行排序,而不仅仅是最后一个字符:
function rev ($s) {return -join ($s[$s.Length..0])}
dir | foreach{rev($_.name)} | sort | foreach{rev($_)}
我认为这里的foreach很好地展示了PowerShell管道如何是数组,而不仅仅是* nix中的字符串。
我花了一会儿时间才意识到,我只能在第二堂之内使用$_
而不用。因此,我学到了一些关于数组内容从一个管道到另一个管道的变化的知识。$_.name
foreach
*我的rev函数的功劳归于http://rosettacode.org/wiki/Reverse_a_string#PowerShell
像lynix一样工作:
像lynix这样的作品,但是非常非常慢:
不要像lynix那样工作,即无法对文件名的所有字符进行排序;(仅对字符串的最后一个字符进行排序):
ls | rev | sort | rev
完全有效。:-)
Shay的变体通过索引到字符串中比接受的答案短得多,但即使这样也可以改进。您可以通过排除不必要的空格并使用较短的别名来进一步缩短它:
ls|sort{$_.Name[-1]}
您也可以将(缩写)-Name
参数用于Get-ChildItem
:
ls -n|sort{$_[-1]}
这将直接返回字符串。
如果您确实要按反向字符串排序,则可以使用以下方法(但速度较慢):
ls -n|sort{$_[3e3..0]}
如果文件名的长度有上限,则可以使其更快。