Suponiendo que "extraño" significa "no un carácter ASCII", puede usarlo findcon 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=Ces obligatoria (en realidad, LC_CTYPE=Cy 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=Chace findque 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=Clugar deLC_COLLATE=Chacerlo, ya que no tiene mucho sentido establecer LC_COLLATE en C sin establecerloLC_CTYPEy asegurarme de que todavía funciona incluso cuando la variable LC_ALL está en el entorno.SPCes imprimible , ¿qué pasaTAByLFcuáles también se encuentran típicamente en los archivos de texto?LC_COLLATEyLC_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 lastrimplementaciones.[y]en mi sistema.[y]s). Gracias.Puede usar
trpara 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
findsalida, 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_CTYPElo que evita que los caracteres inusuales sean reemplazados por signos de interrogación.fuente