En retour – 4
Je trouve important de conserver votre confiance et rétablir la vérité lorsqu’il y a des erreurs/approximations commises. Je vais donc préciser quelques points aujourd’hui.
Je suis sous Xubuntu 15.10 et Debian 8 à la maison, sous Windows Seven au boulot. Je synchronise certains dossiers entre les deux emplacements via Syncthing. J’utilise un alias avec grep à mon domicile pour retrouver mes notes rapidement, j’ai détaillé dans cet article la commande utilisée.
alias grepm='grep --color=always -RInis $*' # Rechercher un mot dans tous les fichiers d'un répertoire
Un beau jour je fais grepm docker
car j’ai un fichier .txt où j’ai pris des notes dessus. Aucun résultat sous Xubuntu 15.10 mais j’en ai sous Debian 8 ! Je retrouve mon fichier et je fais file ~/Sync/Notes/Docker.txt
, je me fais alors insulter par la sortie Non-ISO extended-ASCII text, with CRLF line terminators
. Un classique problème d’encodage des caractères entre Windows (« en général » du Windows-1252) et Linux (« en général » de l’UTF-8), voir l’article précédent.
Pour résoudre ce petit souci, iconv -f $(uchardet Docker.txt) -t UTF-8 Docker.txt -o Docker_utf-8.txt
. A présent file ~/Sync/Notes/Docker_utf-8.txt
donne UTF-8 Unicode text, with CRLF line terminators
. Comment retrouver d’autres fichiers concernés par ce problème ?
find ~/Sync -type f -name "*.txt" -print0 | xargs -0 file | grep Non-ISO > ~/Listing_pb_encodage.txt # C'est un exemple (-name "*.txt" étant tout à fait optionnel)
Mais au fait pourquoi grep n’a donné aucun résultat sur Xubuntu 15.10 ? Parce qu’il a considéré Docker.txt comme un fichier binaire ! Sur Debian 8 la version de grep est la 2.20 et sur Xubuntu 15.10 la version de grep est la 2.21. Voici l’explication qu’on peut trouver dans l’annonce de la version 2.21 de grep : « If a file contains data improperly encoded for the current locale, and this is discovered before any of the file’s contents are output, grep now treats the file as binary ». Trois autres liens (1, 2, 3) sur ce sujet, j’aime bien le dernier car toute la question est de définir ce qu’est un binaire et un fichier texte. L’option -I
(« Traite un fichier binaire comme s’il ne contenait aucune correspondance » d’après le man grep) de mon alias grepm m’a donc mis dans le mur sous Xubuntu 15.10 (avec grep 2.21).
Deux solutions : 1/ Convertir l’encodage des caractères des fichiers 2/ grep -a, --text Traiter un fichier binaire comme s'il s'agissait de texte ; c'est l'équivalent de l'option --binary-files=text
. Cependant d’après le man grep : « Attention utiliser grep -a
peut afficher des données binaires indésirables, qui peuvent avoir des conséquences fâcheuses si la sortie est envoyée vers un terminal et si le pilote de celui-ci l’interprète comme s’il s’agissait de commandes ». Je vous conseille donc de l’utiliser sur un fichier mais pas sur un dossier ou une arborescence.
Résumons et précisons donc mon article.
alias grepm='grep --color=always -RInis $*' # L'alias que je vous conseille pour grep version 2.20 ou inférieure alias grepm='grep --color=always -Rnis $*' # L'alias que je vous conseille pour grep à partir de la version 2.21. grep vous informera ainsi "Fichier binaire Docker.txt correspondant" à vous de faire le reste du chemin
Aaaaaahhh l’encodage des caractères !