2009-12-04 10 views
9

jakie zostało zakwestionowane przez znajomego, aby wykonać następujące czynności: „Znajdź najszybszy i najprostszy sposób sortowania listę katalogów przez ostatni znak nazwy plików”pliki Sortuj według ostatni znak nazwy pliku w PowerShell

Zrobił to na Linux przy użyciu następujących:

ls | rev | sort | rev 

Chciałbym pokazać mu alternatywę powershell, ale jestem dopiero zaczyna się uczyć PowerShell, a ja nie mogę tego zrobić. Oszukuję i proszę o twoją pomoc.

+1

Zanim ktoś głosuje migrować na to pytanie, rzucić okiem na to: http: //meta.stackexchange .pl/questions/32471/wondering-why-i-was-migrated – raven

Odpowiedz

8

Oto mój wpis:

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

i dostać patologiczne:

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

Próbowałem kodu w każdej odpowiedzi i wszystkie działają, ale ta ma najkrótszą składnię. Nie mogę stwierdzić, czy jedna wersja jest szybsza od innych, co wymagałoby odłożenia czasu na folder z dużą ilością plików. – Bratch

5

Niestety Powershell nie ma fajnej łatwej metody odwrotnej, więc zamiast tego musisz zdobyć ostatnią literę ciągu i sortować przez nią. Jest to jeden ze sposobów Zrobiłem to:

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

Jak już wspomniano, to będą sortować ściśle jedynie ostatniego listu, natomiast I wersja Linux będzie sortować według ostatnich, a następnie kolejnych liter, więc nie może być lepszym sposobem na zrobienie tego, lub może trzeba wprowadzić trochę pętli, jeśli chcesz tego w ten sposób.

+0

To świetnie. Nie tak krótki jak alternatywa dla Linuksa, ale wciąż całkiem niezły. –

+0

Zauważyłem też, że sortuje się tylko według ostatniej litery, w przeciwieństwie do wersji Linux. Jednak wyzwanie określone przez "OSTATNI charakter", więc ta odpowiedź odpowiada na pytanie, nawet jeśli te dwa rozwiązania nie są równe. –

+0

Hm, czy funkcja "sort-Descending" nie jest alternatywą? –

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

Nie tak krótki jak w wersji Unix, głównie dlatego, że nie jest funkcją String.Reverse() w .NET Framework. Zasadniczo działa to, sortując "sortuj przez obliczenie tego wyrażenia na argumentach wejściowych".


Teraz, jeśli każdy unix shell robi lepiej niż

dir | sort -Property Length -Descending 

aby wydrukować wszystkie pliki z największego pierwszy byłbym zainteresowany, aby go zobaczyć.

+2

Co powiecie na "ls -S"? – Bryan

+0

Wow! Nie wiedziałem o tym: D Nice one :) – AntonioCS

4

dir | sort {$ _. name [-1]}

4

Shay's variant jest o wiele krótszy niż przyjęta odpowiedź przez indeksowanie w ciągu znaków, ale nawet to można poprawić. Można skrócić go jeszcze bardziej poprzez wyłączenie zbędnych spacji i stosując krótszy alias:

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

Ponadto można użyć (w skrócie) -Name argument Get-ChildItem:

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

która będzie zwracać bezpośrednio sznurki.

Jeśli naprawdę chcesz, aby posortować według napisu odwrotnej, wówczas następujące prace (ale jest powolny):

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

można zrobić to szybciej, jeśli masz ograniczenie górne na długość nazwy pliku w .

+0

Dlaczego nie można po prostu wywołać $ _. Name.Length, aby uzyskać długość (np. Ls -n | sort {$ _ [$ _. Name.Length .. 0]})? – zdan

+0

Mogłem, ale zmarnowałoby to znaki. – Joey

0
dir|select Name,@{ 
    L="R"; 
    E={[char[]]$R=$_.Name; 
    [system.array]::reverse($R); 
    $R -join($null) 
} 
}|sort R