Saltar al contenido

¿Cómo eliminar caracteres no válidos de los nombres de archivo?

Te recomendamos que pruebes esta respuesta en un entorno controlado antes de pasarlo a producción, un saludo.

Solución:

Solución 1:

Una forma sería con sed:

mv 'file' $(echo 'file' | sed -e 's/[^A-Za-z0-9._-]/_/g')

Reemplazar file con su nombre de archivo, por supuesto. Esto reemplazará todo lo que no sea una letra, un número, un punto, un guión bajo o un guión con un guión bajo. Puede agregar o eliminar caracteres para mantenerlos como desee y/o cambiar el carácter de reemplazo a cualquier otra cosa, o nada en absoluto.

Solución 2:

Supongo que está en una caja de Linux y que los archivos se crearon en una caja de Windows. Linux usa UTF-8 como codificación de caracteres para los nombres de archivo, mientras que Windows usa otra cosa. Creo que esta es la causa del problema.

Yo usaría “convmv”. Esta es una herramienta que puede convertir nombres de archivo de una codificación de caracteres a otra. Para Europa occidental uno de estos normalmente funciona:

convmv -r -f windows-1252 -t UTF-8 .
convmv -r -f ISO-8859-1 -t UTF-8 .
convmv -r -f cp-850 -t UTF-8 .

Si necesita instalarlo en un Linux basado en Debian, puede hacerlo ejecutando:

sudo apt-get install convmv

Funciona para mí cada vez y recupera el nombre de archivo original.

Fuente: LeaseWebLabs


Solución 3:

Tenía algunos archivos japoneses con nombres de archivo rotos recuperados de una memoria USB rota y las soluciones anteriores no funcionaron para mí.

Recomiendo el paquete de desintoxicación:

La utilidad de desintoxicación cambia el nombre de los archivos para que sea más fácil trabajar con ellos. Elimina espacios y otras molestias similares. También traducirá o limpiará caracteres Latin-1 (ISO 8859-1) codificados en ASCII de 8 bits, caracteres Unicode codificados en UTF-8 y caracteres de escape CGI.

Ejemplo de uso:

detox -r -v /path/to/your/files
-r Recurse into subdirectories
-v Be verbose about which files are being renamed 
-n Can be used for a dry run (only show what would be changed)

Solución 4:

Supongo que quiere decir que quiere atravesar el sistema de archivos y arreglar todos esos archivos.

Esta es la forma en que lo haría

find /path/to/files -type f -print0 | 
perl -n0e '$new = $_; if($new =~ s/[^[:ascii:]]/_/g) 
  print("Renaming $_ to $newn"); rename($_, $new);
'

Eso encontraría todos los archivos con caracteres que no sean ascii y reemplazaría esos caracteres con guiones bajos (_). Sin embargo, tenga cuidado, si ya existe un archivo con el nuevo nombre, lo sobrescribirá. La secuencia de comandos se puede modificar para verificar tal caso, pero no lo puse para que sea simple.


Solución 5:

Siguiendo las respuestas en https://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-characters, puede usar:

rename 's/[^x00-x7F]//g' *

dónde * coincide con los archivos que desea cambiar de nombre. Si desea hacerlo en varios directorios, puede hacer algo como:

find . -exec rename 's/[^x00-x7F]//g' "" ;

Puede usar el argumento -n para rename hacer un simulacro y ver qué se cambiaría, sin cambiarlo.

Reseñas y puntuaciones

Nos puedes añadir valor a nuestra información participando con tu experiencia en las acotaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *