2019-11-04

PowerShell: Поиск файлов

Как выполнить поиск файлов в командной оболочке PowerShell?



Содержание




Командлет Поиска Файлов


Поиск файлов в PowerShell осуществляется с помощью командлета Get-ChildItem. Вызов данного командлета без аргументов выполнит вывод содержимого текущей директории.


У данного командлета присутствуют несколько псевдонимов (aliases) - ls, dir, gci.


Разберем аргументы командлета позволяющие выполнить поиск файлов.


Поиск По Маске


Аргументы командлета Get-ChildItem позволяют выполнить поиск файлов. Доступные параметры, маска имени файла (-Filter), стартовая директория поиска (-Path), и возможность рекурсивного поиска в поддиректориях (-Recurse).

Поиск по маске, для примера осуществим вывод всех файлов с расширением ZIP.

# Вывод файлов с раширением *.zip
Get-ChildItem *.zip


Файловые маски не могут содержать регулярных выражений, только стандартные "*" (любое количество символов) и "?" (один любой символ).

# Вывод файлов с раширением *.zip и именем состоящим из трех символов
Get-ChildItem ???.zip


Как можно заметить, указывать параметр -Filter не обязательно, командлет сам понимает что ему была передана фильтрующая маска. Порядок следования параметров без их конкретного указания можно посмотреть во встроенной справке.

# Вывод справки
Get-ChildItem -?


Параметр -Path позволяет задать путь начала поиска. Так же он допускает использовать символы файловых масок. Можно совмещать комбинацию фильтров в параметре -Path и -Filter.

Выведем содержимое диска C:\.

# Вывод содержимого указанной директории
Get-ChildItem C:\

# То же самое что и выше, но с прямым указанием параметра
Get-ChildItem -Path C:\


По умолчанию, выводится только содержимое текущей директории, но для полноценного поиска файлов необходимо выполнить обход всех файлов во всех поддиректориях. Осуществить такой обход позволяет параметр -Recurse.

Попробуем найти все файлы с расширением *.msc на диске C:\.

# Вывод всех файлов *.msc на диске C:\
Get-ChildItem -Path C:\ -Filter *.msc -Recurse -ErrorAction SilentlyContinue


Как вы могли заметить, при выводе содержимого диска C:\ отсутствовали скрытые файлы. Отображение скрытых и системных файлов задается атрибутами, о которых поговорим далее.


Поиск По Атрибутам


По умолчанию, скрытые файлы не попадают выходной список командлета Get-ChildItem. Вывод файлов с различными атрибутами, такими как скрытый, системный и прочее, можно задать с помощью параметра -Attributes.

Возможные значения для данного параметра можно посмотреть во встроенной справке по командлету (Get-ChildItem -?).

Важные, или популярные, атрибуты вынесены в отдельные параметры, а именно -Directory, -File, -System, -Hidden.


Попробуем посмотреть файлы скрытые файлы на диске C:\.

# Вывод файлов диска C:\
Get-ChildItem C:\

# Вывод файлов диска C:\ включая скрытые
Get-ChildItem C:\ -Hidden


При указании параметра -Hidden выводятся только скрытые файлы и папки.

С параметром -Attributes все иначе. Он позволяет комбинировать файловые атрибуты. Доступны три операции:

! - NOT, исключает файлы с данным атрибутом (!Directory)
+ - AND, включает файлы со всеми указанными атрибутами (System+Hidden)
, - OR, включает файлы с хотя бы с одним указанным атрибутом (System, Hidden, Directory)

Модификаторы можно комбинировать.

# Вывод файлов диска C:\ с атрибутами - скрытый, системный, директории
Get-ChildItem C:\ -Attributes H,S,D


Сами названия атрибутов можно сокращать, что собственно и было продемонстрировано выше.


Поиск По Дате


Список файлов полученный с помощью вышеописанных способов можно отфильтровать по дате. Делается это с помощью передачи результатов выполнения командлета Get-ChildItem командлету Where-Object.

Пример фильтрации вывода команды по дате, с применением псевдонимов.

# Вывод файлов дата которых больше или равна дате 28.10.2019 20:00
ls | ? LastAccessTime -GE (Get-Date "28.10.2019 20:00")


Для командлета Where-Object можно задать так же другие условия, или даже несколько условий. Подробнее об этом можно узнать в справке по данному командлету.


Поиск По Содержимому


Поиск по содержимому, предполагает обход всех файлов с целью найти в них искомый текст. Выполнить данную операцию можно с помощью передачи всех файлов по конвейеру командлету Select-String.

Для примера я создал три текстовых файла с текстом:

1.txt (first)
2.txt (second)
3.txt (first second third)


Структура расположения файлов следующая.


Теперь примеры поиска текста в данных файлах с помощью PowerShell.

# Поиск всех файлов с текстом "first"
Get-ChildItem -Recurse | Select-String "first"


Вывод данной команды немного скудный, нет информации о файлах. Это легко поправить, выполнив передачу полученных данных снова командлету Get-ChildItem. На этот раз воспользуемся псевдонимами для сокращения ввода команд.

# Поиск всех файлов с текстом "first" с подробным выводом информации о файлах
ls -r | Select-String "first" | ls



Использование Найденных Файлов


Полученные списки файлов, всеми вышеописанными способами, можно передавать по конвейеру таким командлетам как Remove-Item, Move-ItemCopy-Item и прочим подобным. Тем самым упрощая работу с полученными файлами.


Итог


В статье было рассмотрено: Как выполнить поиск файлов в командной оболочке PowerShell?

Комментариев нет :

Отправка комментария