Подтвердить что ты не робот

Как удалить файлы в папке, соответствующей регулярному выражению, с помощью PowerShell?

Я знаю общую характеристику имен файлов нескольких нежелательных файлов на моем компьютере под управлением Windows. Как удалить все эти файлы из определенной папки или иерархии папок с помощью одного регулярного выражения команды PowerShell?

4b9b3361

Ответ 1

Вы можете передать команду Get-ChildItem через фильтр Where-Object, который принимает шаблон RegEx, а затем передать его в Remove-Item. Я думаю, что это даст вам быстрый и лучший результат, чем использование Select-String. С помощью команды вроде:

Get-ChildItem $Path | Where{$_.Name -Match "<RegEx Pattern>"} | Remove-Item

Атрибут Name будет соответствовать только имени файла или папки, а также расширению файла. Это не будет соответствовать другим вещам на этом пути. Это передаст объект FileInfo по каналу, который Remove-Item будет принимать по каналам ввода и удалит файлы, о которых идет речь.

Если вы хотите включить вложенные папки вашего пути, вы должны добавить переключатель -Recurse в команду Get-ChildItem, и он будет выглядеть следующим образом:

Get-ChildItem $Path -Recurse | Where{$_.Name -Match "<RegEx Pattern>"} | Remove-Item

Если вы хотите только удалить файлы, вы можете указать это в инструкции Where, посмотрев свойство объекта PSIsContainer объекта FileInfo и инвертируя его, префикс объекта с восклицательным знаком вроде:

Get-ChildItem $Path -Recurse | Where{$_.Name -Match "<RegEx Pattern>" -and !$_.PSIsContainer} | Remove-Item

Ответ 2

Вы можете использовать команду

ls -name | select-string -pattern ".*\(\d+\).*" | %{rm $_}

Если содержание кавычек является вашим регулярным выражением. Регулярное выражение в этом примере ищет файлы с (#) в имени файла, где # - любое целое неотрицательное число. Это полезно для удаления дубликатов в папке, в которой один и тот же набор файлов был удален многократно, например, с помощью музыкального менеджера.

Если вы добавили -r после -name

ls -name -r | select-string -pattern ".*\(\d+\).*" | %{rm $_}

он рекурсирует через подпапки и удалит соответствующие файлы во всех подпапках.

Структура команды выглядит следующим образом:

  • ls является псевдонимом команды get-childitem команды powershell. В нем перечислены все элементы в текущей папке. Аргумент -name указывает, что должны быть созданы только имена; Мне не нужна другая информация, например размер файла.
  • select-string в основном эквивалентна UNIX grep, где она соответствует шаблону (регулярному выражению) для группы строк, разделенных строками. Параметр -pattern задает командлет до появления регулярного выражения.
  • % {rm $} - цикл foreach. Он говорит: "для каждой строки, переданной мне (из выборки в этом случае)", выполните следующее действие, где $- заданная строка. В этом случае мы rm-ing элемент, где rm является псевдонимом для Remove-Item.

Ответ 3

Я бы использовал это:

(Get-ChildItem -Path $Path | Select -ExpandProperty Fullname) -match <regex> | Remove-Item
(Get-ChildItem -Path $Path -Recurse | Select -ExpandProperty Fullname) -match <regex> | Remove-Item

или если у вас есть V3 или выше, поэтому у вас есть автоматическое перечисление элементов:

 (Get-ChildItem -Path $Path).Fullname -match <regex> | Remove-Item
 (Get-ChildItem -Path $Path -Recurse).Fullname -match <regex> | Remove-Item

Имя будет работать только в том случае, если ваш текущий рабочий каталог является каталогом, из которого вы удаляете файлы, и все файлы находятся в этом каталоге (рекурсия может содержать более одного файла с тем же именем, но разные пути).