Solution 1 :
Une façon 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 remplacer le caractère de remplacement par autre chose, ou rien du tout.
Solution 2 :
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 de 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 peut convertir les noms de fichiers d'un encodage de caractères à un autre. Pour l'Europe de l'Ouest, l'une de ces méthodes 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 avez besoin de 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 récupère le nom de fichier d'origine.
Source :LeaseWebLabs
Solution 3 :
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. Il traduira ou nettoiera é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 d'échappement 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)
Solution 4 :
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 trouverait tous les fichiers avec des caractères non-ascii et remplacerait ces caractères par des traits de soulignement (_
). Soyez prudent 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 ajouté pour rester simple.
Solution 5 :
Suite aux réponses sur https://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-characters, vous pouvez utiliser :
rename 's/[^\x00-\x7F]//g' *
où *
correspond aux fichiers que vous souhaitez 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
faire un essai, et voir ce qui serait changé, sans le changer.