Extraction d'une liste de fichiers qui contiennent un/des caractère spéciaux.

shellxy - Modifié le 9 juil. 2021 à 14:29
 Shellxy - 28 juil. 2021 à 17:16
Bonjour à tous,
Préparant un projet de migration (service microsoft ondrive) je vais migrer les données utilisateurs.
cependant certain caractères spéciaux que contiennent le nom des fichiers sont bloquants.
J'aimerais donc créé un fichier listant les "fichiers ou dossiers" qui contiennent les fameux caractères non autorisé pour les modifier avec l'utilisateur final.
voici les caractères : ~ "# % & * : < > ? / \ { | }.
ainsi que l'espace en debut et en fin de chaine.

initialement, j'ai fais un script pour lister dans un fichier txt les éléments de plus de 256 caractères :
Get-ChildItem "E:\users\" -r * |? {$_.fullname.length -ge 256} |%{$_.fullname} | out-file "C:\extraction fichiers trop long.txt"

j'aimerais faire quelque chose d'identique avec les fichiers contenant les caractères citées plus haut.

4 réponses

hypothetix Messages postés 52 Date d'inscription dimanche 19 janvier 2020 Statut Membre Dernière intervention 2 octobre 2022 6
Modifié le 12 juil. 2021 à 15:49
Bonjour,

Get-ChildItem "E:\users\" -r *  | where {$_.basename -match '~|"|#|%|&|:|<|>|/|\|>
'} |%{$_.fullname}

Tu noteras que cela ne fonctionne pas avec les caractères ? et * (qui listent tous les fichiers)
0
Ho un grand merci :)

cette commande prend-elle également les espace en début et en fin de chaine?

encore grand merci
0
hypothetix Messages postés 52 Date d'inscription dimanche 19 janvier 2020 Statut Membre Dernière intervention 2 octobre 2022 6
13 juil. 2021 à 09:56
Oui.
Get-ChildItem "E:\users\" -r * | where {$_.basename -match '^\s|\s$|~|"|#|%|&|:|<|>|/|\|>'} |%{$_.fullname}

Pour commencer avec les expressions régulières tu peux lire :
https://docs.microsoft.com/fr-fr/dotnet/standard/base-types/regular-expression-language-quick-reference
0
Bonjour, je me suis basé sur ce que tu m'as indiquer pour réaliser une opération: je dois supprimer les espaces (ou les remplacer par un _) qui se trouve en fin de chaine.
j'ai bien testé celà qui fonctionne mais pour tout les espaces :
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace(' ', '_') }

et j'ai donc appliqué ce que tu m'as indiqué :

Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace('\s$', '_') }

sans succès...j'ai pourtant l'impression que ma démarche est pas si mauvaise !
0
hypothetix Messages postés 52 Date d'inscription dimanche 19 janvier 2020 Statut Membre Dernière intervention 2 octobre 2022 6 > Shellxy
27 juil. 2021 à 20:54
Bonsoir,

pas de regex pour .replace
donc : $_.replace(' ', '_') //il y a un espace entre les 2 premières simples quote ( ' )
0
Shellxy > hypothetix Messages postés 52 Date d'inscription dimanche 19 janvier 2020 Statut Membre Dernière intervention 2 octobre 2022
28 juil. 2021 à 08:42
haaa, mais celà remplace TOUT les espace et pas seulement celui qui se trouve en fin de chaine, je me trompe?
0
hypothetix Messages postés 52 Date d'inscription dimanche 19 janvier 2020 Statut Membre Dernière intervention 2 octobre 2022 6 > Shellxy
28 juil. 2021 à 12:40
Effectivement ca remplace tous les espaces.
Pour ne remplacer que le premier et le dernier je te propose:
Get-ChildItem $path -File -Recurse | Where-Object { $_.basename.Contains(' ') } | Rename-Item -NewName { ($_.basename -replace "(.*)\A\s|\s\Z(.*)", '$1_$2') + $_.extension }

Nota:
Apparemment le -replace n'accepte pas le $ pour fin de la chaîne je l'ai remplacé par \Z
donc:
\s\Z pour espace en fin de chaine
\A\s pour espace en début de chaine

PUB:
Les expressions régulières sont utilisées dans plein de langages Python, PHP, MySQL, Java, Javascript etc...
Donc ca vaut la peine de passer un minimun de temps à les comprendre.
https://regex101.com/ pour les décortiquer et tester.
0
Shellxy > hypothetix Messages postés 52 Date d'inscription dimanche 19 janvier 2020 Statut Membre Dernière intervention 2 octobre 2022
28 juil. 2021 à 17:16
HA effectivement, le $ ne fonctionne pas...étrange.

ta solution fonctionne, je serais tenté de là modifier pour supprimer 1 ou plusieurs espace à la fin du nom de fichier avec un \s+$ soit un \s+Z vu que le $ ne fonctionne pas.

j'ai également supprimer le "_" pour "supprimer" et non pas remplacer les espaces.

merci beaucoup de ton aide. je n'aurais jamais trouvé. (surtout coté syntaxe pure powershell à vrai dire.)

je test tout celà :)
0
un tres grand merci
0