Powershellチャレンジ


7

私は友人から次のことをするように求められました:

「ファイル名の最後の文字でディレクトリ一覧を並べ替える最も迅速で簡単な方法を見つけてください。」

彼はLinuxで次のようにしてそれを行いました:

ls | rev | sort | rev 

私は彼にPowershellの代替案を紹介したいのですが、Powershellを学び始めたばかりで、それを行うことはできません。だから、私はごまかして、あなたの助けを求めています。


1
実際、それは最後の文字だけでなく、それに続くすべての文字で並べ替えています。以下のSam Coganの回答は、厳密に最後の文字であり、後続の文字は無視されます。
Sim

誰も投票が再びこの質問を移行する前に、このを見て:meta.stackexchange.com/questions/32471/...
レイヴン

このチャレンジは誤解を招くものであり、さらにLinuxとPowerShellの公平な比較ではないと思います。revが最後の文字のみをソートする場合、それは公平です。また、「ls | rev | sort | ls」のように単純に行うのではなく、最後の文字のみをソートするようにbashなどを書くように依頼することも、より公平な場合があります。しかし、正直なところ、PowerShellがshと同じくらいコンパクトでありながらリンゴとオレンジを比較できることを誰かに納得させることを除いて、なぜ誰もがこの奇妙な関数を望んでいるのです。
2014

回答:


3

残念ながら、Powershellには簡単なリバースメソッドがありません。そのため、代わりに文字列の最後の文字を取得し、それで並べ替える必要があります。これは私がやった方法の1つです。

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

指摘したように、これは厳密に最後の文字のみで並べ替えますが、Linuxバージョンでは最後の文字とその後の文字で並べ替えられるため、これを行うより良い方法があるか、ループを導入する必要がある場合があります。そうしたいなら


それはブリルです。Linuxの代替品ほど短くはありませんが、それでもかなり優れています。
Richard

Linuxバージョンとは異なり、これは最後の文字でのみ並べ替えられることにも気付きました。ただし、課題は「最後の文字で」と述べたため、2つのソリューションが等しくなくても、この回答が質問に答えます。
Richard

いくつかの混乱のため、この質問はスタックオーバーフローに移行され、その後移行されませんでした。スタックオーバーフローのキースヒルが短い回答ls | sort {"$ _" [-1]}を追加
Richard


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

UNIXバージョンほど短くはありません。主に、.NET FrameworkにString.Reverse()関数がないためです。基本的に、これは「入力引数でこの式を計算してソートする」というソートを行うことで機能します。


さて、もしUNIXシェルが

dir | sort -Property Length -Descending

最大のファイルを最初にすべてのファイルを印刷するには、それを確認したいと思います。


4
「ls -S」はどうですか?
ブライアン

うわー!これについては知りませんでした:Dニース:)
AntonioCS

2

誰かがこれをもっと上手にできると確信していますが、これがlynixと完全に互換性のある1つの方法です。これには、revツールボックスに再利用可能な文字列関数を残すという利点があります。つまり、最後の文字だけでなく、文字列全体を並べ替えます。

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

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

ここのforeachは、PowerShellパイプが配列であり、* nixのような単なる文字列ではないことをうまく示していると思います。

2つ目で$_はなく$_.name、2つ目だけを使用する必要があることを理解するのに少し時間がかかりましたforeach。そのため、あるパイプから次のパイプへの配列コンテンツの変化について何かを学びました。

*私のrev関数の根性のクレジットはhttp://rosettacode.org/wiki/Reverse_a_string#PowerShellに移動します


lynixのように動作します。

  • dir | sort -Property @ {Expression = {$ n = $ _。Name.ToCharArray(); [配列] :: Reverse($ n); [文字列] :: Join( ""、$ n)}}

lynixのような作品ですが、非常に遅いです:

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

lynixのように機能しないでください。つまり、ファイル名のすべての文字をソートできません。(文字列の最後の文字のみを並べ替えます):

  • dir | 並べ替え{$ .name.Substring($ .name.length-1)}
  • dir | 並べ替え{$ _。name [-1]}
  • ls | sort {$ _。Name [-1]}
  • ls | sort {"$ _" [-1]}
  • ls -n | sort {$ _ [-1]}

これは、rev関数が配列を受け入れるようにすることで改善できます。その後、関数がforEachを呼び出すため、コードからforEachを削除できます。いくつかを追加して、ls | rev | sort | revそれ自体で完全に有効にすることができます。:-)
Cory Knutson 2017年

1

シェイのバリアントは、文字列にインデックスを付けることにより、受け入れられた回答よりもはるかに短いですが、それでも改善できます。不要なスペースを除外し、短いエイリアスを使用することで、さらに短縮できます。

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

また、(省略された)-Name引数を使用して次のこともできますGet-ChildItem

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

文字列を直接返します。

本当に逆の文字列でソートしたい場合は、次のように動作します(ただし時間がかかります)。

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

ファイル名の長さに上限がある場合は、より速くすることができます。


質問からの引用:»ファイル名の最後の文字でディレクトリ一覧をソートする最も迅速で簡単な方法を見つけます。«。最後の文字で並べ替えるだけです。最も簡単な方法が文字列を逆にすることである場合もそうですが、最も簡単な方法が最後の文字で並べ替えることである場合は、これによりタスクも解決されます。問題は「PowerShellでこのUnixシェルのスニペットをまったく同じにするにはどうすればよいですか?」ではありませんでした。
ジョーイ14年

ごめんなさい。間違って理解しました。
楕円形ビュー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.