0 votes

Suppression récursive de tous les caractères invalides des fichiers texte en place

Je possède plusieurs milliers de fichiers texte, dont certains contiennent des caractères UTF-8 non valides. Je veux supprimer récursivement tous les caractères non valides de ces fichiers en place.

Je suis conscient que de nombreuses questions similaires ont été posées auparavant, telles que : Comment supprimer les caractères non UTF-8 d'un fichier texte ? mais je n'en ai pas trouvé une qui soit à la fois récursive et qui fonctionne sur place.

4voto

0942v8653 Points 6754

L'avantage des commandes UNIX est que vous pouvez les combiner entre elles. iconv ne sait pas comment récurer dans les répertoires, mais find fait. Il peut appeler iconv sur chaque fichier qu'il voit.

(Ces commandes convertiront tous les fichiers dans le répertoire courant et tous dans les répertoires. Assurez-vous que vous êtes dans le répertoire dans lequel vous voulez convertir tous les fichiers de manière récursive).

Pour modifier tous les fichiers avec l'extension .txt :

find . -type f -name '*.txt' -print0 | 
    while IFS= read -r -d $'\0' filename; do 
        iconv -f utf-8 -t utf-8 -c "$filename" > "$filename".iconv_cleaned_utf8
        mv "$filename".iconv_cleaned_utf8 "$filename"
    done

Je suppose que ce code nécessite quelques explications. Ce qu'il fait est :

  • find affiche tous les noms des fichiers concernés, séparés par un octet nul (l'octet nul est le seul caractère invalide pour un chemin de fichier).
  • bash read s les noms de fichiers et les parcourt en boucle
  • iconv convertit le fichier en un fichier temporaire avec une extension supplémentaire
  • nous mv le fichier temporaire pour remplacer le fichier original.

S'ils ont des extensions différentes (c'est le cas pour tous les fichiers du répertoire actuel), supprimez l'élément -name *.txt

C'est un peu plus propre si vous disposez de l'option sponge l'utilité de moreutils mais il n'est pas installé par défaut.

find . -type f -name '*.txt' -print0 | 
    while IFS= read -r -d $'\0' filename; do 
        iconv -f utf-8 -t utf-8 -c "$filename" | sponge "$filename"
    done

0voto

Steve Chambers Points 21588

Cela ne répond peut-être pas à toute la question mais je suis un heureux utilisateur de BBEdit depuis un certain nombre d'années (au moins avant OSX...). Je l'utilise pour le hacking HTML et l'ouverture occasionnelle de fichiers que je n'arrive pas à comprendre.

Il dispose d'une fonction intéressante appelée Zap Gremlins, qui supprime tout un tas de caractères étranges et non ASCII de n'importe quel fichier. Ce qui ressemble beaucoup à ce que vous devez faire.

ET il est massivement scriptable, mais pas gratuit. Il peut être qui vaut la peine d'être examiné pour voir s'il fera ce que vous voulez.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X