En supposant que "étranger" signifie "pas un caractère ASCII", vous pouvez utiliser find
avec un modèle pour rechercher tous les fichiers ne contenant pas de caractères ASCII imprimables dans leurs noms:
LC_ALL=C find . -name '*[! -~]*'
(L'espace est le premier caractère imprimable répertorié sur http://www.asciitable.com/ , ~
est le dernier.)
L'astuce pour LC_ALL=C
est requise (en fait, LC_CTYPE=C
et LC_COLLATE=C
), sinon la plage de caractères n'est pas interprétée correctement. Voir aussi la page de manuel glob(7)
. Étant donné que les LC_ALL=C
causes find
interprètent les chaînes comme ASCII, il imprime des caractères multi-octets (tels que π
) comme des points d'interrogation. Pour résoudre ce problème, cat
redirigez vers un programme (par exemple ) ou redirigez vers un fichier.
Au lieu de spécifier des plages de caractères, [:print:]
peut également être utilisé pour sélectionner des "caractères imprimables". Assurez-vous de définir les paramètres régionaux C ou vous obtenez un comportement tout à fait (apparemment) arbitraire.
Exemple:
$ touch $(printf '\u03c0') "$(printf 'x\ty')"
$ ls -F
dir/ foo foo.c xrestop-0.4/ xrestop-0.4.tar.gz π
$ find -name '*[! -~]*' # this is broken (LC_COLLATE=en_US.UTF-8)
./x?y
./dir
./π
... (a lot more)
./foo.c
$ LC_ALL=C find . -name '*[! -~]*'
./x?y
./??
$ LC_ALL=C find . -name '*[! -~]*' | cat
./x y
./π
$ LC_ALL=C find . -name '*[![:print:]]*' | cat
./x y
./π
LC_ALL=C
place deLC_COLLATE=C
car cela n'a pas beaucoup de sens de définir LC_COLLATE sur C sans définirLC_CTYPE
et de s'assurer qu'il fonctionne toujours même lorsque la variable LC_ALL est dans l'environnement.SPC
est imprimable , qu'en est-TAB
il de ceuxLF
qui se trouvent généralement dans les fichiers texte?LC_COLLATE
etLC_CTYPE
, voir aussi lafind(1)
page de manuel.Si vous traduisez chaque nom de fichier à l'aide
tr -d '[\200-\377]'
et le comparez avec le nom d'origine, tous les noms de fichier comportant des caractères spéciaux ne seront pas les mêmes.(Ce qui précède en supposant que vous voulez dire non ASCII avec étranger)
la source
[
et]
dans la plupart destr
implémentations.[
et]
sur mon système.[
et des]
s). Merci.Vous pouvez utiliser
tr
pour supprimer tout caractère étranger d'un nom de fichier et comparer le résultat avec le nom de fichier d'origine pour voir s'il contenait des caractères étrangers.la source
find
sortie, utilisez la sortie / entrée terminée par NUL comme indiqué dans cette réponse .La réponse acceptée est utile, mais si vos noms de fichiers sont déjà dans l'encodage spécifié dans
LANG
/LC_CTYPE
, il est préférable de simplement faire:Les classes de caractères sont affectées par
LC_CTYPE
, mais la commande ci-dessus n'utilise pas de classes de caractères, uniquement des plages, doncLC_CTYPE
empêche simplement les caractères inhabituels d'être remplacés par des points d'interrogation.la source