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?
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
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:
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).