web-dev-qa-db-fra.com

Changer l'encodage de chaque fichier .txt d'un dossier et de ses sous-dossiers

J'ai un dossier inclure de nombreux fichiers txt et sous-dossiers qui contient également de nombreux fichiers txt.

Je veux changer l'encodage de tous les fichiers automatiquement. À l'heure actuelle, je sais comment modifier un fichier à l'aide de la commande:

iconv -f gbk -t utf8 sample.txt > sample.wiki

J'ai besoin du nom du fichier non modifié et changer son extension en .wiki. Comment puis-je y parvenir automatiquement?

3

Vous pouvez parcourir les fichiers .txt, modifier le codage, enregistrer la sortie dans le fichier .wiki du même nom à l’aide de l’option -o de iconv et, en cas de succès, supprimer le .txt fichier:

shopt -s globstar  ## Enables recursive glob matching
for f in **/*.txt; do
    iconv -f gbk -t utf8 -o "${f%.txt}".wiki "$f" && rm "$f"
done

Avertissement:

Si le fichier d'entrée n'est pas dans le codage source donné ou déjà dans le codage cible, iconv retournera la valeur true sans effectuer d'opération. Par conséquent, le fichier .wiki ne sera pas créé et le fichier .txt sera supprimé.

Pour contourner ce problème, vous pouvez enregistrer le STDOUT après conversion dans une variable. Si la variable n'est pas vide, sauvegardez la sortie dans le fichier .wiki et supprimez le fichier txt:

shopt -s globstar  ## Enables recursive glob matching
for f in **/*.txt; do
    out="$(iconv -f gbk -t utf8 "$f")" 
    [[ -n $out ]] && echo "$out" >"${f%.txt}".wiki && rm "$f"
done
4
heemayl