Powershell挑战


7

我受到一位朋友的挑战,请执行以下操作:

“找到通过文件名的LAST字符对目录列表进行排序的最快,最简单的方法。”

他使用以下方法在Linux上完成了此操作:

ls | rev | sort | rev 

我想向他展示powershell的替代方案,但是我只是开始学习powershell而我做不到。所以,我在作弊并寻求您的帮助。


1
实际上,这不仅按最后一个字符进行排序,而且还按后面的所有字符进行排序。萨姆·科根(Sam Cogan)在下面的回答完全由最后一个字符组成,而忽略后面的任何字符。

在任何人的投票再次迁移这个问题,看看这个:meta.stackexchange.com/questions/32471/...
乌鸦

我认为这个挑战是令人误解的,而且不能将Linux与PowerShell进行合理的比较。如果rev只排序最后一个字符,那将是公平的。同样更公平的是还要求人们写bash或仅排序最后一个字符的内容,而不仅仅是:“ ls | rev | sort | ls”。但是说实话,为什么有人会想要这个奇怪的功能,但我还是要抓紧时间,除非试图说服某人PowerShell可以像sh一样紧凑,但可以将苹果与橘子进行比较?
椭圆视图

Answers:


3

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

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

正如已经指出的那样,这将仅按最后一个字母进行排序,而我的Linux版本将按最后一个以及随后的字母进行排序,因此可能有更好的方法,或者您可能需要引入一些循环如果您想要那样的话。


太好了 不如Linux替代产品那么短,但仍然相当不错。
理查德

我也注意到,这与Linux版本不同,仅按最后一个字母排序。但是,挑战是用“最后一个字符”表示的,因此即使两个解决方案不相等,此答案也可以回答问题。
理查德

由于某些混淆,此问题已迁移到堆栈溢出,然后又未迁移。Keith Hill on Stack溢出添加了较短的答案ls | sort {“ $ _” [-1]}
理查德


2
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 -S'怎么样?
布赖恩

哇!不知道这一个:D好一个:)
AntonioCS

2

我确定有人可以做得更好,但这是一种与lynix完全兼容的方法。它的好处是rev为您的工具箱提供了可重复使用的字符串函数,即,它对整个字符串进行排序,而不仅仅是最后一个字符:

function rev ($s) {return -join ($s[$s.Length..0])}

dir | foreach{rev($_.name)} | sort | foreach{rev($_)}

我认为这里的foreach很好地展示了PowerShell管道如何是数组,而不仅仅是* nix中的字符串。

我花了一会儿时间才意识到,我只能在第二堂之内使用$_而不用。因此,我学到了一些关于数组内容从一个管道到另一个管道的变化的知识。$_.nameforeach

*我的rev函数的功劳归于http://rosettacode.org/wiki/Reverse_a_string#PowerShell


像lynix一样工作:

  • 目录 排序-属性@ {表达式= {$ n = $ _。Name.ToCharArray(); [Array] :: Reverse($ n); [String] :: Join(“”,$ n)}}

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

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

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

  • 目录| 排序{$ .name.Substring($ .name.length-1)}
  • 目录| 排序{$ _。name [-1]}
  • ls | sort {$ _。Name [-1]}
  • ls | sort {“ $ _” [-1]}
  • ls -n | sort {$ _ [-1]}

这可以通过使rev函数接受一个数组来改善。然后,您可以消除代码中的forEach,因为该函数将调用它。您可以添加一些内容以使其ls | rev | sort | rev完全有效。:-)
Cory Knutson

1

Shay的变体通过索引到字符串中比接受的答案短得多,但即使这样也可以改进。您可以通过排除不必要的空格并使用较短的别名来进一步缩短它:

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

您也可以将(缩写)-Name参数用于Get-ChildItem

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

这将直接返回字符串。

如果您确实要按反向字符串排序,则可以使用以下方法(但速度较慢):

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

如果文件名的长度有上限,则可以使其更快。


引用以下问题:»找到用文件名的LAST字符对目录列表进行排序的最快,最简单的方法。«。它只需要按最后一个字符排序。如果最简单的方法是反转字符串,那么,但是,如果最简单的方法是仅按最后一个字符排序,那么这也解决了任务。问题不是关于»如何在PowerShell中完全一样地执行Unix shell的这一片段?«。
Joey

抱歉。我错了
椭圆视图

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.