Tengo archivos con caracteres no válidos como estos
009_-_�%86ndringshåndtering.html
Es un lugar Æ
donde algo salió mal en el nombre del archivo.
¿Hay alguna manera de eliminar todos los caracteres no válidos?
o podría tr
ser usado de alguna manera?
echo "009_-_�%86ndringshåndtering.html" | tr ???
Respuestas:
Una forma sería con sed:
Reemplace
file
con su nombre de archivo, por supuesto. Esto reemplazará cualquier cosa que no sea una letra, número, punto, guión bajo o 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.fuente
f='file'; mv 'file' ${f//[^A-Za-z0-9._-]/_}
Supongo que está en la caja de Linux y los archivos se hicieron en una caja de Windows. Linux usa UTF-8 como codificación de caracteres para los nombres de archivo, mientras que Windows usa algo más. Creo que esta es la causa del problema.
Yo usaría "convmv". Esta es una herramienta que puede convertir nombres de archivos de una codificación de caracteres a otra. Para Europa occidental, uno de estos normalmente funciona:
Si necesita instalarlo en un Linux basado en Debian, puede hacerlo ejecutando:
Siempre funciona para mí y recupera el nombre de archivo original.
Fuente: LeaseWebLabs
fuente
Save the current file in Word 97-2004 format\sco.workflow
que se creó en mi Mac (a través de Microsoft Office) y las codificaciones anteriores no tienen ningún efecto.--notest
opción de cambiar el nombre de los archivos.¿Supongo que quiere decir que quiere atravesar el sistema de archivos y corregir todos esos archivos?
Así es como lo haría
Eso buscaría todos los archivos con caracteres no ASCII y reemplazaría esos caracteres con guiones bajos (
_
). Sin embargo, tenga cuidado, si ya existe un archivo con el nuevo nombre, lo sobrescribirá. El script se puede modificar para verificar un caso así, pero no lo puse para que sea simple.fuente
Las siguientes respuestas en https://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-characters , pueden usar:
donde
*
coincide con los archivos que desea renombrar. Si desea hacerlo en varios directorios, puede hacer algo como:Puede usar el argumento -n
rename
para hacer una ejecución en seco y ver qué cambiaría, sin cambiarlo.fuente
Tenía algunos archivos japoneses con nombres de archivo rotos recuperados de un dispositivo USB roto y las soluciones anteriores no funcionaron para mí.
Recomiendo el paquete de desintoxicación:
Ejemplo de uso:
fuente
detox
antes de reinventar esencialmente la rueda. Si observa la página de manual, verá que cubre todas las otras soluciones propuestas aquí debido a su flexibilidad.的节奏啊
, pero esos caracteres son nombres de archivo válidos.Este script de shell desinfecta un directorio de forma recursiva, para hacer que los archivos sean portátiles entre Linux / Windows y FAT / NTFS / exFAT. Elimina los caracteres de control
/:*?"<>\|
y algunos nombres reservados de Windows comoCOM0
.Linux es menos restrictivo en teoría (
/
y\0
está estrictamente prohibido en los nombres de archivo), pero en la práctica varios caracteres interfieren con los comandos bash (como*
...), por lo que también deben evitarse en los nombres de archivo.Grandes fuentes para restricciones de nombres de archivos:
fuente
Si desea manejar líneas nuevas incrustadas, caracteres multibyte, espacios, guiones iniciales, barras invertidas y espacios, necesitará algo más robusto, vea esta respuesta:
https://superuser.com/a/858671/365691
Pongo el script en code.google.com si alguien está interesado: rnf-bash-rename-script
fuente
Utilizo esta línea para eliminar caracteres no válidos en los archivos de subtítulos:
Funciona para normalizar los nombres de directorio de películas:
Los mismos pasos que arriba pero agregué un comando sed más para eliminar un punto al final del directorio
X-Men Days of Future Past (2014) [1080p]
Modificado a:
X-Men.Days.of.Future.Past.2014.1080p
fuente
para archivo en *; do mv "$ archivo" $ (echo "$ archivo" | sed -e 's / [^ A-Za-z0-9. -] / / g'); hecho &
fuente