Una solución un tanto peligrosa es esta, desde la línea de comandos:
find . -type f ! -regex '.*/[ -.0-~]*' -exec rm {} +
Reemplace el lone .
con el nombre del directorio superior si no ha cambiado primero al directorio relevante. Para estar seguro, sin embargo intente primero el comando más corto
find . -type f ! -regex '.*/[ -.0-~]*'
y asegúrese de que solo enumera los archivos que desea eliminar. La expresión regular (regexp, o regex) aquí coincidirá con cualquier ruta de acceso que termine en una barra inclinada seguida de cualquier combinación de caracteres ASCII imprimibles, excluyendo /
, los caracteres de espacio son los primeros y ~
el último, mientras que .
y 0
surround /
en la secuencia ASCII.
Una advertencia entre muchas: no estoy seguro de si la configuración regional actual puede cambiar la secuencia de clasificación de los caracteres y, por lo tanto, quizás cambie el significado de la expresión regular. No creo que lo haga, pero si lo hace, ejecuta los comandos como
LC_COLLATE=C find …
debería eliminar el peligro.
Otra advertencia: asegúrese de tener una copia de seguridad antes de intentar esto. No me responsabilizaré por ninguna pérdida de datos si se equivoca. ¡La línea de comando es una gran herramienta para dispararte en el pie! A veces, solo un espacio fuera de lugar puede significar un desastre. (En este caso, por ejemplo, perder el espacio individual después de que el corchete izquierdo es mortal).