Parfois, j'ai besoin de rechercher des fichiers avec des caractères accentués (diacritiques en général), généralement avec local/mlocate. Je souhaite configurer (peut-être dans /etc/updatedb.conf
) afin de me permettre de rechercher ces caractères spéciaux à l'aide d'un certain mappage de langue, par exemple:
a == âàáäÂÀÂÄ
e == êèéëÊÈÉË
i == îïíÎÏ
o == ôöóÔÖ
u == ûùüÛÜÙ
c == çÇ
n == ñ
Ainsi, locate -i liberación
recherche également les fichiers avec la chaîne liberacion et même liberaciòn .
find
mlocate
developer) dites ici que l'officiel le code source est sur pagure.io (et ne fourche sur Github ) .-t
/--transliterate
en utilisant iconv
pour une accentuation accentuée.mlocate
avec le support de --transliterate
est maintenant inclus dans Ubuntu 18.04 LTS Bionic Beaver ( v2 et v3.1 ).Maintenant, avec mlocate 0.26, nous avons l'option -t --transliterate
(voir la page de manuel ) sur Ubuntu 18.04+ (sans avoir besoin de contournements impairs):
Créer des fichiers de test:
$ touch liberación liberacion liberaciôn
Mettre à jour et rechercher:
$ updatedb
$ locate --transliterate liberacion
/home/pablo/liberacion
/home/pablo/liberación
/home/pablo/liberaciôn
Donc maintenant locate -t liberación
également rechercher les fichiers avec la chaîne liberacion
et même liberaciòn
!
Enfin, créer un alias sur mon .bashrc :-)
$ alias locate="locate --transliterate"
Si nous examinons updatedb.conf(5)
, nous constaterons qu’il n’ya pas grand chose à faire avec les éléments de configuration.
Nous allons donc écrire un script en utilisant locate
; À la fin, nous pouvons exécuter quelque chose comme my-locate.sh liberacion
ou my-locate.sh liberâciòn
et cela nous apportera toutes les combinaisons possibles.
Commencez par créer un fichier simple en tant que base de données où vous le souhaitez, par exemple: ~/.mydb
; puis ajoutez vos caractères d'accents dans ce fichier comme ceci:
aâàáäÂÀÂÄ
eêèéëÊÈÉË
iîïíÎÏ
uûùüÛÜÙ
cçÇ
oôöóÔÖóòòò
...
...
Ensuite, nous avons besoin d’un petit script qui fait le travail pour nous, j’en ai écrit un simple:
#!/bin/bash
# Final search term
STR=""
# Loop throughout all characters of desired string
for (( i=0; i<${#1}; i++ )); do
# Split the string in one char
CH="${1:$i:1}"
# Find all possible combinations of this char
CHARS=$(grep "$CH" ~/.mydb)
# Add an "or" operator between characters
REG=$(echo "$CHARS" | sed 's/.\{1\}/&\|/g' )
REG="($REG)"
# Append all possible combination of this character
# to our final search term as an or statement
if [ "$REG" == '()' ];
then
STR=$STR$CH
else
STR=$STR$REG
fi
done
# locate it using regex
locate --regex "$STR$"
Enregistrez-le maintenant quelque part dans votre PATH avec le nom souhaité, par exemple: in ~/bin
. Il devrait être déjà dans votre environnement PATH.
Après tout, utilisez simplement quelque chose comme ceci pour rechercher toutes les combinaisons possibles.
my-locate.sh liberacion
Trouvera pour moi tout ceci:
~/lab/liberacion
~/lab/liberaciòn
~/lab/liberación
~/lab/liberâciòn
~/lab/liberäciòn
~/lab/libÈrâciòn