web-dev-qa-db-fra.com

Comment supprimer des fichiers dans un dossier correspondant à une expression régulière à l'aide de PowerShell?

Je connais une caractéristique commune des noms de fichiers d'un certain nombre de fichiers indésirables sur mon ordinateur Windows. Comment puis-je supprimer tous ces fichiers d'un dossier ou d'une hiérarchie de dossiers donné avec une seule commande expression régulière PowerShell?

24
Techrocket9

Vous pouvez diriger une commande Get-ChildItem via un filtre Where-Object qui accepte un modèle RegEx, puis le diriger vers Remove-Item. Je pense que vous obtiendrez un résultat plus rapide et meilleur que l'utilisation de Select-String. Avec une commande comme:

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

L'attribut Name ne correspondra qu'au nom du fichier ou du dossier, ainsi qu'à l'extension d'un fichier. Cela ne correspondra pas à d'autres choses le long du chemin. Cela passera un objet FileInfo dans le tuyau, que Remove-Item prend comme entrée canalisée et supprimera les fichiers en question.

Si vous souhaitez inclure des sous-dossiers de votre chemin, vous devez ajouter le commutateur -Recurse à votre commande Get-ChildItem, et cela ressemblerait à ceci:

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

Si vous souhaitez uniquement supprimer des fichiers, vous pouvez spécifier cela dans l'instruction Where en consultant la propriété PSIsContainer de l'objet FileInfo et en l'inversant en préfixant l'objet avec un point d'exclamation comme celui-ci:

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

Vous pouvez utiliser la commande,

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

Où le contenu des guillemets est votre expression régulière. L'expression régulière dans cet exemple recherche les fichiers qui ont (#) dans le nom de fichier, où # est un entier non négatif. Ceci est utile pour supprimer les doublons dans un dossier où le même ensemble de fichiers a été sauvegardé plusieurs fois, par exemple par un gestionnaire de musique.

Si vous ajoutez un -r après le -nom

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

il recursera par le biais de sous-dossiers et supprimera les fichiers correspondants dans tous les sous-dossiers.

La structure de la commande est la suivante:

  • ls est un alias pour la commande powershell get-childitem. Il répertorie tous les éléments du dossier actuel. L'argument -name spécifie que seuls les noms doivent être produits; Je ne veux pas d'autres informations comme la taille du fichier.
  • select-string est principalement équivalent à grep UNIX, où il fait correspondre un modèle (regex) à un tas de chaînes séparées par des lignes. Le paramètre -pattern définit la cmdlet pour prendre une expression régulière.
  • % {rm $ } est une boucle foreach. Elle dit, "pour chaque ligne redirigée vers moi (à partir de select-string dans ce cas)", effectuez l'action suivante, où $ est la ligne donnée . Dans ce cas, nous rmons l'élément, où rm est un alias pour Remove-Item.
4
Techrocket9

J'utiliserais ceci:

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

ou si vous disposez de la version 3 ou supérieure, vous disposez donc d'une énumération automatique des membres:

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

Le nom ne fonctionnera que si votre répertoire de travail actuel est le répertoire dans lequel vous supprimez des fichiers et que tous les fichiers se trouvent dans ce répertoire (un récursif peut trouver plusieurs fichiers portant le même nom, mais des chemins différents).

2
mjolinor