88 votes

Comment supprimer les caractères invalides des noms de fichiers ?

J'ai des fichiers avec des caractères invalides comme ceux-ci

009_-_%86ndringshåndtering.html

Il s'agit d'un Æ où quelque chose s'est mal passé dans le nom du fichier.

Existe-t-il un moyen de supprimer tous les caractères non valides ?

ou pourrait tr être utilisé d'une manière ou d'une autre ?

echo "009_-_%86ndringshåndtering.html" | tr ???

75voto

H. Hess Points 671

J'avais des fichiers japonais avec des noms de fichiers cassés récupérés à partir d'une clé usb cassée et les solutions ci-dessus n'ont pas fonctionné pour moi.

Je recommande le forfait détox :

L'utilitaire de désintoxication renomme les fichiers pour les rendre plus faciles à utiliser. Il supprime les espaces et autres désagréments de ce type. Il traduit ou nettoie également les caractères Latin-1 (ISO 8859-1) encodés en ASCII 8 bits, les caractères Unicode encodés en UTF-8 et les caractères échappés de CGI.

Exemple d'utilisation :

detox -r -v /path/to/your/files

\-r Recurse into subdirectories
-v Be verbose about which files are being renamed 
-n Can be used for a dry run (only show what would be changed)

62voto

James Sneeringer Points 6645

Une façon de le faire serait avec sed :

mv 'file' $(echo 'file' | sed -e 's/[^A-Za-z0-9._-]/_/g')

Remplacer file avec votre nom de fichier, bien sûr. Cela remplacera tout ce qui n'est pas une lettre, un chiffre, un point, un trait de soulignement ou un tiret par un trait de soulignement. Vous pouvez ajouter ou supprimer des caractères à conserver comme vous le souhaitez, et/ou changer le caractère de remplacement par n'importe quoi d'autre, ou rien du tout.

48voto

Angelstam Points 1

Je suppose que vous êtes sur une boîte Linux et que les fichiers ont été créés sur une boîte Windows. Linux utilise UTF-8 comme codage des caractères pour les noms de fichiers, tandis que Windows utilise autre chose. Je pense que c'est la cause du problème.

J'utiliserais "convmv". Il s'agit d'un outil qui permet de convertir les noms de fichiers d'un codage de caractères à un autre. Pour l'Europe occidentale, l'un de ces outils fonctionne normalement :

convmv -r -f windows-1252 -t UTF-8 .
convmv -r -f ISO-8859-1 -t UTF-8 .
convmv -r -f cp-850 -t UTF-8 .

Si vous devez l'installer sur un Linux basé sur Debian, vous pouvez le faire en exécutant :

sudo apt-get install convmv

Cela fonctionne pour moi à chaque fois et permet de récupérer le nom de fichier original.

出典 LeaseWebLabs

23voto

Andriyev Points 9238

Je suppose que vous voulez dire que vous voulez parcourir le système de fichiers et réparer tous ces fichiers ?

Voici comment je procéderais

find /path/to/files -type f -print0 | \
perl -n0e '$new = $_; if($new =~ s/[^[:ascii:]]/_/g) {
  print("Renaming $_ to $new\n"); rename($_, $new);
}'

Cela permettrait de trouver tous les fichiers contenant des caractères non ascii et de les remplacer par des caractères de soulignement ( _ ). Faites attention cependant, si un fichier avec le nouveau nom existe déjà, il l'écrasera. Le script peut être modifié pour vérifier un tel cas, mais je ne l'ai pas mis pour rester simple.

18voto

Cormac O'Brien Points 121

Réponses à l'adresse suivante https://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-characters Vous pouvez l'utiliser :

rename 's/[^\x00-\x7F]//g' *

donde * correspond aux fichiers que vous voulez renommer. Si vous voulez le faire sur plusieurs répertoires, vous pouvez faire quelque chose comme :

find . -exec rename 's/[^\x00-\x7F]//g' "{}" \;

Vous pouvez utiliser l'argument -n pour rename pour faire un essai, et voir ce qui serait changé, sans le changer.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X