Get-ChildItem w Powershell: znajdywanie plików po nazwie, atrybutach, rozszerzeniu i wielkości


 

Dzisiejszy powershell’owy artykuł dotyczy znajdywania plików i folderów po wielu różnych kryteriach. Przy okazji przedstawi też ciekawe sposoby wyświetlania wyników, jak choćby pełne ścieżki do plików, co nie jest takie oczywiste i trzeba nieco pokombinować:).

W powershellu znajdziemy niezwykle popularny cmdlet, który użyjemy nie tylko do przeszukiwania struktury plików, ale też rejestru. Z tych dwóch, dzisiaj omówimy pierwsze, czyli przeszukiwanie systemu plików. Wasze skojarzenia z DOSowym poleceniem DIR są jak najbardziej słuszne, z zaznaczeniem, iż Get-ChildItem może znacznie więcej.

Powershell Get-ChildItem od postaw

Zawartość dysku lub katalogu (w moim przykładzie jest to c:\windows) wyświetlimy poleceniem:

Get-ChildItem c:\windows

Jak widać zobaczymy listę i plików i folderów, bez pełnych ścieżek. W tej formie wyszukiwanie nie odbywa się jednak w głąb (rekursywnie) – widzimy tylko zawartość bieżącego katalogu:
get-childitem-1

Dodam jeszcze, że domyślnie Powershell nie znajduje plików w katalogów które mają atrybut „hidden”. Możemy to ominąć parametrem -force.

Get-ChildItem c:\windows -Force

Aby wyświetlić zawartość katalogu i podkatalogów (wyszukiwanie rekursywne), użyjmy przełącznika -recurse:

Get-ChildItem c:\ -Recurse

Wynik będzie podobny do tego:
get-childitem-2
Gdybyśmy chcieli ograniczyć wynik do samych nazw katalogów, możemy skorzystać ze sztuczki z artykułu o formatowaniu wyników w Powershellu:

Get-ChildItem c:\windows | format-table Name

Jak znaleźć tylko pliki lub tylko katalogi?

Tylko katalogi:

Get-ChildItem c:\ -directory

Tylko pliki:

Get-ChildItem c:\ -file

Znajdywanie plików po nazwie

Gwiazdkę jako symbol zastępujący ciąg znaków wszyscy pewnie pamiętamy z DOSa :)
W ten oto sposób znajdziemy na dysku C i we wszystkich podkatalogach pliki i foldery mające w nazwie frazę „centos”.

Get-ChildItem c:\ -recurse -include *centos*

A tu, znajdziemy tylko pliki, które mają fragment nazwy „ps” i nie mają frazy „roboczy”:

Get-ChildItem c:\ -recurse -include *ps* -exclude *roboczy*

Znajdywanie plików po rozszerzeniu

Wszystkie pliki DLL na dysku C znajdziemy poleceniem:

Get-ChildItem c:\ -recurse -include *.dll

Możemy wyszukać kilka różnych rozszerzeń. Na przykład wszystkie pliki ISO i BIN na dysku C znajdziemy poleceniem:

Get-ChildItem c:\ -recurse -include *.iso,*.bin

Można też wykonać wyszukiwanie plików z rozszerzeniami innymi niż…

Get-ChildItem c:\windows\ -exclude *.txt

Znajdywanie plików po atrybutach

Tak możemy znaleźć wszystkie pliki do odczytu na dysku C:

Get-ChildItem c:\ -recurse -file -read

A tak możemy znaleźć wszystkie pliki systemowe dysku C:

Get-ChildItem c:\ -recurse -file -system

Jak wyświetlić pełne ścieżki do plików w Powershell?

Jak pewnie zauważyliście, domyślnie wyniki zawierają same nazwy plików i katalogów. Zawartość katalogu C:\Windows w formie listy pełnych ścieżek wyświetlimy następująco:

Get-childitem c:\Windows | % {Write-Host $_.FullName}

Wyszukiwanie plików po rozmiarze

Oto jak znaleźć (na całym dysku C:) pliki większe niż 3GB (rekursywnie):

Get-ChildItem c:\ -Recurse | where {$_.Length -gt 3GB}

W wersji z pełną ścieżką:

Get-ChildItem c:\ -Recurse | where {$_.Length -gt 3GB} | % {Write-Host $_.FullName}

Wynik będzie podobny do tego:
get-childitem-3

Jak przeliczyć rozmiar plików z KB na GB w Powershellu?

Na przykładzie znajdywania plików powyżej 3GB: przeliczenie możemy wykonac w momencie formatowania wyniku do tabeli. W ten oto sposób, obok samej nazwy pliku wyświetlimy rozmiar w GB.

Get-childitem c: -Recurse |? {$_.Length -gt 3GB} | select name,@{n=”size”;e={„{0:N2}” -f ($_.Length/1GB)}} | ft -auto

Sortowanie wyników

Sortowanie wyników po rozmiarze wykonamy poleceniem:

Get-ChildItem c:\ -Recurse | Sort-Object length

To samo sortowanie, ale rosnąco:

Get-ChildItem c:\ -Recurse | Sort-Object length | Sort-Object length -descending

W tym artykule to już wszystko, niebawem opisze jak zliczać ilość i mierzyć wielkość znalezionych plików oraz przedstawię kilka bardziej zaawansowanych kryteriów wyszukiwania.


Podobne Tematy:

  • Sayu

    Powinno być napisane „ZnajdOwać” a nie „ZnajdYwać”! Pozdrawiam ;)

  • Sayu

    No i „znaleźć” a nie „znalyźć”. No chyba, że jest Pan ze śląska :D

    • Heh mieliśmy w redakcyjnym gronie mnówstwo debat na to, czy internauci naprawdę wyłąpują błędy. Dziękuje za poparcie moje tezy:) Natomaist co do literówki „znalyźć” – nie widzę takowej. W którym zdaniu to padło? (sprawdziłem, że dzisiaj nikt z kolegów nie edytował mi wpisu)

      • Sayu

        A nie nie, to tylko takie wyjaśnienie do poprzedniego komentarza :D Co do poprawności obu form – znalazłam informację, że zdecydowanie częściej używa się Znajdować :D Możliwe, że to tylko lekkie zboczenie zawodowe z mojej strony i wyłapuję takie rzeczy w większości tekstów :D

        • U nas takie zdolności ma redaktor Rafał. Jak on czegoś nie wyłapie, to żaden słownik nie wyłapie. A co do formy „znajdywać” z czystej ciekawości poszukam głębiej – może są jakieś niuanse np znajdYwanie jest w formie „niedokonanej”..

        • Sayu

          Powodzenia! :D

  • Marek

    Bardzo przydatne polecenia do robienia porządków na dysku :) Konsola (PS) jak widać wiele potrafi

  • Jacek

    Jak wyświetlić nazwy katalogów posortowanych po dacie utworzenia (rosnąco lub malejąco)
    Get-ChildItem E:katalog -Name -Directory | Sort-Object ???

    • Jacek

      Można tak, na szybko zrobiłem ale pewnie do poprawy – w zależności od warunków można wyświetlić równe z datą, starsze niż. Jak wpiszę Foreach-Objec {$_.FullName} to wyświetli mi ścieżkę
      get-childitem -Path e:katalog -Directory –recurse |
      where-object {$_.lastwritetime -le (get-date).addDays(-15)} |
      Foreach-Object { $_.Name }