私は友人から次のことをするように求められました:
「ファイル名の最後の文字でディレクトリ一覧を並べ替える最も迅速で簡単な方法を見つけてください。」
彼はLinuxで次のようにしてそれを行いました:
ls | rev | sort | rev
私は彼にPowershellの代替案を紹介したいのですが、Powershellを学び始めたばかりで、それを行うことはできません。だから、私はごまかして、あなたの助けを求めています。
私は友人から次のことをするように求められました:
「ファイル名の最後の文字でディレクトリ一覧を並べ替える最も迅速で簡単な方法を見つけてください。」
彼はLinuxで次のようにしてそれを行いました:
ls | rev | sort | rev
私は彼にPowershellの代替案を紹介したいのですが、Powershellを学び始めたばかりで、それを行うことはできません。だから、私はごまかして、あなたの助けを求めています。
回答:
残念ながら、Powershellには簡単なリバースメソッドがありません。そのため、代わりに文字列の最後の文字を取得し、それで並べ替える必要があります。これは私がやった方法の1つです。
dir| sort {$_.name.Substring($_.name.length-1)}
指摘したように、これは厳密に最後の文字のみで並べ替えますが、Linuxバージョンでは最後の文字とその後の文字で並べ替えられるため、これを行うより良い方法があるか、ループを導入する必要がある場合があります。そうしたいなら
dir | sort -Property @{Expression ={$n = $_.Name.ToCharArray(); [Array]::Reverse($n);[String]::Join("",$n)}}
UNIXバージョンほど短くはありません。主に、.NET FrameworkにString.Reverse()関数がないためです。基本的に、これは「入力引数でこの式を計算してソートする」というソートを行うことで機能します。
さて、もしUNIXシェルが
dir | sort -Property Length -Descending
最大のファイルを最初にすべてのファイルを印刷するには、それを確認したいと思います。
誰かがこれをもっと上手にできると確信していますが、これが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のように動作します。
lynixのような作品ですが、非常に遅いです:
lynixのように機能しないでください。つまり、ファイル名のすべての文字をソートできません。(文字列の最後の文字のみを並べ替えます):
ls | rev | sort | rev
それ自体で完全に有効にすることができます。:-)
シェイのバリアントは、文字列にインデックスを付けることにより、受け入れられた回答よりもはるかに短いですが、それでも改善できます。不要なスペースを除外し、短いエイリアスを使用することで、さらに短縮できます。
ls|sort{$_.Name[-1]}
また、(省略された)-Name
引数を使用して次のこともできますGet-ChildItem
。
ls -n|sort{$_[-1]}
文字列を直接返します。
本当に逆の文字列でソートしたい場合は、次のように動作します(ただし時間がかかります)。
ls -n|sort{$_[3e3..0]}
ファイル名の長さに上限がある場合は、より速くすることができます。