¿Cómo eliminar un nombre de archivo de caracteres especiales?

6

Tengo un archivo con un nombre como "Date.txt de hoy"

Lo que me interesa es eliminar todos los caracteres especiales que utilizan el terminal, como:

" - , ' ' [ 

El motivo de esto es porque los inserto en un script más tarde y es un dolor de cabeza que explica y cambia los nombres individualmente.

Los espacios "" y los guiones bajos "_" y el alfabeto "A-Z, a-z" están bien y, por lo tanto, se están reemplazando los caracteres en lugar de borrarlos.

Al principio, pensé que el comando de terminal "iconv" podría ayudarme al convertir a una codificación más simple, pero probé varias de las codificaciones y parece que podría estar equivocado.

Sé que las expresiones regulares me pueden ayudar, pero lamentablemente no estoy bien versado en ellas. Encontré esta pregunta que parece estar relacionada, pero no sé cómo implementarla o si cubre los mismos casos que el mío.

La razón por la que publiqué esto aquí es porque esta pregunta podría ser exclusiva del conjunto de caracteres que OSX admite para los nombres de archivo y la codificación que utiliza ... aunque es más probable que no tenga idea de lo que estoy hablando.

Gracias por su ayuda de antemano.

Editar: El comando

sed 's/[!@#\$%^&*()]//g'

Parece que funciona muy bien, pero no puedo hacerlo funcionar para mi caso de uso original y otros:

' ' "

Escapar de ellos tampoco funciona. Soy muy nuevo en los scripts de bash, así que ten paciencia conmigo.

Edición 2: publicar esto aquí o, de lo contrario, tendría que esperar 6 horas.

Además de la respuesta de Alan Shutko, me gustaría agregar mi propia solución que encontré.

awk '{gsub(/[[:punct:]]/,"")}1'

Estoy un poco indeciso a publicar esto ya que no puedo explicarlo bien.

Awk, como dice su página de manual, se usa para "escaneo dirigido por patrones y lenguaje de procesamiento". La función gsub busca y reemplaza todas las apariciones de la expresión regular que ingresa. La parte gsub se vería así:

gsub("a","b")

Donde en mi ejemplo, todas las apariciones de a serían reemplazadas por b. Al igual que en el comentario anterior, [[: punct:]] suena como si representara todos los signos de puntuación. Sin embargo, no sé qué significa el 1 en el exterior de los corchetes.

    
pregunta fredie mathews 07.06.2013 - 03:09

3 respuestas

10

Si tiene un conjunto específico de caracteres que desea conservar, tr funciona muy bien.

Por ejemplo

tr -cd 'A-Za-z0-9_-'

Eliminará cualquier carácter que no esté en el conjunto de caracteres enumerados. (La -d significa eliminar, y la -c significa el complemento de los caracteres enumerados: en otras palabras, cualquier carácter no listado se elimina).

    
respondido por el Alan Shutko 07.06.2013 - 04:00
5

Esto solo reemplazaría las comillas simples con guiones bajos:

for f in *; do mv "$f" "${f//'/_}"; done

Esto solo mantendría caracteres ASCII alfanuméricos, guiones bajos y puntos:

for f in *; do mv "$f" "$(sed 's/[^0-9A-Za-z_.]/_/g' <<< "$f")"; done

Las configuraciones regionales como en_US.UTF-8 usan el orden de intercalación ASCII en OS X, pero [[:alnum:]] y \w también coinciden con caracteres como ä en ellas. Si LC_CTYPE es C , los caracteres de múltiples bytes se reemplazan con múltiples guiones bajos.

    
respondido por el user495470 07.06.2013 - 16:39
1

Hace poco tuve el mismo problema y tuve que eliminar los nombres de archivo de todos los archivos en una carpeta de caracteres especiales. Utilicé este comando, que es una combinación de ambas respuestas publicadas aquí, pero también mantiene los puntos. Tal vez ayude a alguien.

for file in *; do echo mv "$file" 'echo $file | tr -cd 'A-Za-z0-9_.-'' ; done

eliminar el echo frente a mv "$file" ejecuta el comando.

    
respondido por el intagli 15.11.2016 - 18:09

Lea otras preguntas en las etiquetas