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