GNU/Linux >> Tutoriels Linux >  >> Linux

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

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' *

* 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.


Linux
  1. Comment désinstaller aria2 d'Ubuntu

  2. Comment supprimer les lignes qui apparaissent sur le fichier B d'un autre fichier A ?

  3. Supprimer les espaces blancs des noms de fichiers sous Linux

  4. Comment supprimer l'iso 9660 de l'USB ?

  5. Renommer plusieurs fichiers pour supprimer le suffixe commun des noms de fichiers

Comment supprimer une commande de l'historique sous Linux

Comment supprimer les caractères (^M) d'un fichier sous Linux

Comment supprimer les espaces des noms de fichiers sous Linux

Comment supprimer tous les espaces blancs d'un fichier texte

Comment supprimer Swap Space de Centos 7.x ?

Comment supprimer les fichiers de zone de mon serveur ?