GNU/Linux >> Tutoriales Linux >  >> Linux

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

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 quitar 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 archivos 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.

Así es como lo haría

find /path/to/files -type f -print0 | \
perl -n0e '$new = $_; if($new =~ s/[^[:ascii:]]/_/g) {
  print("Renaming $_ to $new\n"); 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' *

donde * 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 para hacer un simulacro y ver qué se cambiaría, sin cambiarlo.


Linux
  1. ¿En qué se diferencian las expresiones regulares de los comodines utilizados para filtrar archivos?

  2. ¿Cómo eliminar las líneas que aparecen en el archivo B de otro archivo A?

  3. ¿Cómo cambiar el nombre de forma masiva de archivos con codificación no válida o reemplazar de forma masiva caracteres codificados no válidos?

  4. ¿Cómo elimino el código VS y la configuración de Ubuntu?

  5. Cómo evitar que un proceso escriba archivos

Cómo quitar un comando del historial en Linux

Cómo quitar (^M) caracteres de un archivo en Linux

Cómo quitar espacios de los nombres de archivo en Linux

Cómo quitar todos los caracteres de espacio en blanco de un archivo de texto

¿Cómo eliminar Swap Space de Centos 7.x?

¿Cómo elimino archivos de zona de mi servidor?