题 Powershell挑战


我被朋友挑战要做以下事情:

“找到按文件名的最后一个字符排序目录列表​​的最快捷最简单的方法。”

他是在Linux上使用以下方法完成的:

ls | rev | sort | rev 

我想向他展示powershell的替代方案,但我只是刚刚开始学习powershell而我无法做到。所以,我在欺骗并寻求你的帮助。


8
2017-12-04 09:20




实际上,不只是最后一个字符而是后面的所有字符对它进行排序。下面的Sam Cogan的答案完全取决于最后一个字符,并忽略任何后续字符。 - Sim
在任何人投票再次迁移此问题之前,请看一下: meta.stackexchange.com/questions/32471/... - raven
我认为这个挑战是误导性的,而且还不能公平地比较linux和PowerShell。如果rev只对最后一个字符进行排序,那么这将是公平的。另外可能更公平的还是要求人们写bash或其他只对最后一个字符进行排序,而不仅仅是:“ls | rev | sort | ls”。但老实说,为什么有人会想要这个奇怪的功能我还在摸不着头脑,除了试图让别人相信PowerShell可以像sh一样紧凑,但是苹果与橘子的比较呢? - Eliptical view


答案:


不幸的是,Powershell没有一个很好的简单反向方法,所以你必须得到字符串的最后一个字母并按此排序。这是我做过的一种方式:

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

正如已经指出的那样,这将严格按最后一个字母排序,而我的Linux版本将按最后一个字母和后续字母排序,因此可能有更好的方法来执行此操作,或者您可能必须引入一些循环如果你想那样。


3
2017-12-04 10:23



那是个傻瓜。不像Linux替代品那么短,但仍然相当不错。 - Richard
我也注意到这只是最后一个字母排序,不像linux版本。然而,挑战是“最后一个角色”,所以这个答案回答了这个问题,即使这两个解决方案并不相同。 - Richard
由于一些混淆,这个问题被迁移到Stack Overflow然后未迁移。堆栈溢出的Keith Hill添加了较短的答案ls | sort {“$ _”[ - 1]} - Richard


DIR |排序{$ _。名称[-1]}


8
2017-12-05 18:09





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

不像unix版本那么简短,主要是因为.NET Framework中没有String.Reverse()函数。基本上,这是通过在输入参数上计算这个表达式来排序'排序'。


现在,如果任何unix shell做得比

dir | sort -Property Length -Descending

首先打印所有最大的文件,我有兴趣看到它。


2
2017-12-05 17:05



'ls -S'怎么样? - Bryan
哇!不知道这个:D好一个:) - AntonioCS


我相信有人可以做得更好,但这里有一种与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一样工作:

  • dir | sort -Property @ {Expression = {$ n = $ _。Name.ToCharArray(); [阵列] ::逆向($ n)的; [字符串] ::加入( “”,$ N)}}

像lynix一样的作品,但非常非常慢:

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

不要像lynix一样工作 即无法对文件名的所有字符进行排序; (仅对字符串的最后一个字符进行排序):

  • DIR |排序{$.name.Substring($.name.length-1)}
  • DIR |排序{$ _。名称[-1]}
  • LS |排序{$ _名称[-1]}
  • LS |排序{ “$ _”[ - 1]}
  • ls -n | sort {$ _ [ - 1]}

2
2018-01-18 04:44



这可以通过使rev函数接受一个数组来改进。然后你可以在代码中消除forEach,因为函数会调用它。你可以添加一些东西来制作 ls | rev | sort | rev 完全有效。 :-) - Cory Knutson


谢伊的变种 通过索引到字符串中的方式比接受的答案短,但即便如此也可以改进。您可以通过排除不必要的空格并使用较短的别名来进一步缩短它:

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

你也可以使用(缩写) -Name 论证 Get-ChildItem

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

这将直接返回字符串。

如果你真的想按照排序 相反 字符串,然后以下工作(但很慢):

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

如果文件名的长度有上限,则可以加快速度。


1
2017-12-06 14:49



引用问题:»找到按文件名的最后一个字符排序目录列表​​的最快捷最简单的方法。«它只需要按最后一个字符排序。如果这样做最简单的方法就是反转字符串,那么就这样吧,但如果最简单的方法就是按最后一个字符排序,那么这也解决了这个问题。问题不是关于»如何在PowerShell中完成相同的Unix shell片段?«。 - Joey
抱歉。我弄错了。 - Eliptical view


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

-1
2017-12-09 20:57