Я знаю общую характеристику имен файлов нескольких нежелательных файлов на моем компьютере под управлением Windows. Как удалить все эти файлы из определенной папки или иерархии папок с помощью одного регулярного выражения команды PowerShell?
Как удалить файлы в папке, соответствующей регулярному выражению, с помощью PowerShell?
Ответ 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
Имя будет работать только в том случае, если ваш текущий рабочий каталог является каталогом, из которого вы удаляете файлы, и все файлы находятся в этом каталоге (рекурсия может содержать более одного файла с тем же именем, но разные пути).