Suponiendo que "extraño" significa "no un carácter ASCII", puede usarlo find
con un patrón para encontrar todos los archivos que no tienen caracteres ASCII imprimibles en sus nombres:
LC_ALL=C find . -name '*[! -~]*'
(El espacio es el primer carácter imprimible que aparece en http://www.asciitable.com/ , ~
es el último).
La sugerencia para LC_ALL=C
es obligatoria (en realidad, LC_CTYPE=C
y LC_COLLATE=C
), de lo contrario, el rango de caracteres se interpreta incorrectamente. Vea también la página del manual glob(7)
. Dado que LC_ALL=C
hace find
que las cadenas se interpreten como ASCII, imprimirá caracteres de varios bytes (como π
) como signos de interrogación. Para solucionar esto, diríjase a algún programa (por ejemplo cat
) o redirija a un archivo.
En lugar de especificar rangos de caracteres, [:print:]
también se puede usar para seleccionar "caracteres imprimibles". Asegúrese de establecer la configuración regional C o obtendrá un comportamiento bastante (aparentemente) arbitrario.
Ejemplo:
$ 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
lugar deLC_COLLATE=C
hacerlo, ya que no tiene mucho sentido establecer LC_COLLATE en C sin establecerloLC_CTYPE
y asegurarme de que todavía funciona incluso cuando la variable LC_ALL está en el entorno.SPC
es imprimible , ¿qué pasaTAB
yLF
cuáles también se encuentran típicamente en los archivos de texto?LC_COLLATE
yLC_CTYPE
, vea también la página defind(1)
manual.Si traduce cada nombre de archivo utilizando
tr -d '[\200-\377]'
y lo compara con el nombre original, los nombres de archivo que tengan caracteres especiales no serán los mismos.(Lo anterior suponiendo que se refiere a no ASCII con extranjero)
fuente
[
y]
en la mayoría de lastr
implementaciones.[
y]
en mi sistema.[
y]
s). Gracias.Puede usar
tr
para eliminar cualquier carácter extraño de un nombre de archivo y comparar el resultado con el nombre original para ver si contenía caracteres extraños.fuente
find
salida, use la salida / entrada terminada en NUL como se muestra en esta respuesta .La respuesta aceptada es útil, pero si sus nombres de archivo ya están en la codificación especificada en
LANG
/LC_CTYPE
, es mejor simplemente hacer lo siguiente:Las clases de caracteres se ven afectadas
LC_CTYPE
, pero el comando anterior no usa clases de caracteres, solo rangos, porLC_CTYPE
lo que evita que los caracteres inusuales sean reemplazados por signos de interrogación.fuente