Conforme te vas adentrando en el uso del terminal te vas dando cuenta de todas las posibilidades que ofrece, y lo mas impresionante de todo es que siempre te sorprende. Una de las caracterÃsticas que hasta la fecha no habÃa explorado suficientemente era la manipulación de texto en el terminal.
Aunque, esto de manipular texto en el terminal te puede sonar extraño, o que raramente lo vas a utilizar… nada mas lejos de la realidad. Una de las operaciones mas habituales que haces en el terminal es cambiar el nombre o la extensión a un archivo. Eso lo puedes hacer manualmente, pero ¿que pasa cuando tienes que renombrar de forma masiva 10 archivos?¿y si en lugar de ser 10 son 100 o 1.000?…. ¿Si tienes 1.000 imágenes en formato JPEG y las quieres convertir a PNG?
En este artÃculo te mostraré algunas de las posibilidades que te ofrece bash para manipular texto. Esto lo vamos a ver mediante algunas recetas verdaderamente útiles sobre edición de texto en el terminal.
Manipulando texto en el terminal
Empezando por lo básico
Lo primero, veamos algunos elementos básicos,
- Para averiguar la longitud de una cadena ${#cadena}
cadena="ejemplo" echo ${#cadena} 7
Mayúsculas y minúsculas
- Convertir una cadena a minúsculas ${cadena,,}
cadena="EJEMPLO" echo ${cadena,,} ejemplo
- Convertir solo la primera letra de una cadena a minúsculas ${cadena,}
cadena="EJEMPLO" echo ${cadena,} eJEMPLO
- Convertir una cadena a mayúsculas ${cadena^^}
cadena="ejemplo" echo ${cadena^^} EJEMPLO
- Convertir solo la primera letra de una cadena a mayúsculas ${cadena^}
cadena="ejemplo" echo ${cadena^} Ejemplo
Subcadenas
- Extraer una subcadena
cadena="ejemplo" echo ${cadena:4} plo echo ${cadena:1:2} je echo ${cadena:(-2)} lo
Sustituyendo texto
- Reemplazar parte de una cadena
cadena="imagen.png" echo ${cadena/.png/.jpg} imagen.jpg
- Reemplazar todas las apariciones de una subcadena en una cadena
cadena="Supercalifragilisticexpialidocious" echo ${cadena/i/a} # Solo reemplazamos la primera aparición de `i` en la cadena Supercalafragilisticexpialidocious echo ${cadena//i/a} # Reemplazamos todas las apariciones de `i` en la cadena Supercalafragalastacexpaaladocaous
- Quitar todas las apariciones de una subcadena en una cadena
echo ${cadena//i} Supercalfraglstcexpaldocous
- Si solo queremos quitar la primera aparición
echo ${cadena/i} Supercalfragilisticexpialidocious
Quitando texto…
- Si queremos quitar parte del texto desde el principio. Con esta primera opción quitamos la parte mas corta…
cadena="Supercalifragilisticexpialidocious" echo ${cadena#Super} califragilisticexpialidocious echo ${cadena#*r} califragilisticexpialidocious
- Mira la diferencia entre eliminar la parte mas corta de eliminar la parte mas larga
cadena="Supercalifragilisticexpialidocious" echo ${cadena#*i} fragilisticexpialidocious echo ${cadena##*i} ous
- Estas mismas operaciones las podemos hacer por la parte de atrás, es decir por el final de la cadena de texto
cadena="Supercalifragilisticexpialidocious" echo ${cadena%i*} Supercalifragilisticexpialidoc echo ${cadena%%i*} Supercal
A por las recetas de edición de texto en el terminal
Ahora vamos a ver algunas recetas en las que la edición de texto en el terminal nos va a ser de mucha utilidad, y sobre todo, nos va a ahorrar trabajo.
Convertir imágenes de formato
Para esta primera receta utilizaremos la herramienta convert. Esto nos va a permitir convertir todas las imágenes que se encuentren en el directorio, del formato JPEG al formato PNG
for i in *.jpg;do convert "$i" "${i/.jpg/.png}";done
Otra opción para hacer lo mismo…
for i in *.jpg;do convert "$i" "${i%.jpg}.png";done
Recuerda poner las » comillas, de esta manera evitarás el problema con los espacios en blanco en los nombres de los archivos.
La diferencia entre la primera y la segunda opción se encuentra en que en el primer caso si dentro del nombre del archivo se encuentra la subcadena .jpg, ya tenemos el problema. Por ejemplo,
beach-2952391_1280.jpg.jpg beach-2952391_1280.png.jpg # Utilizando el primer método beach-2952391_1280.jpg.png # Utilizando el segundo método
Una de audio….
La primera de las recetas nos permitirá convertir audio del formato OGG al formato MP3
for i in *.ogg; do ffmpeg -i "$i" "${i%.*}.mp3"; done
La segunda de las recetas nos permitirá extraer el audio de archivos de vÃdeo,
for i in *.mkv; do ffmpeg -i "$i" -vn -ab 128k -ar 44100 -y "${i%.*}.mp3"; done
Modificando los tÃtulos de los capÃtulos de tu serie preferida
Desde hace tiempo que vengo utilizando el siguiente formato para guardar los capÃtulos de mi serie preferida, titulo de la serie – SXXEYY.mkv donde SXXEYY se refiere a la temporada XX episodio YY. Aquà tienes toda una variedad de opciones. Algunos ejemplos
01 - nombre de la serie.mkv for i in *.mkv; do mv "${i:5:-4} - S01E${i:0:2}.mkv" ; done nombre de la serie - S01E01.mkv
¿Y si quieres que esté toda en mayúsculas?
01 - nombre de la serie.mkv for i in *.mkv; do j=${i^^}; mv "${j:5:-4} - S01E${j:0:2}.mkv" ; done NOMBRE DE LA SERIE - S01E01.mkv
Lo mismo podrÃamos hacer para el caso de minúsculas… o capitalizando texto.
01 - nombre de la serie.mkv for i in *.mkv; j="${i:5:-4} - S01E${i:0:2}.mkv";j="${j^}; mv "$i" "$j"; done NOMBRE DE LA SERIE - S01E01.mkv
Conclusión
Como puedes ver las opciones y posibilidades que tienes para manipular texto en el terminal, y en concreto para renombrar, editar y modificar los nombres de los archivos, son muy variadas. Esto te da todo un amplio abanico de posibilidades para realizar tareas masivas.
Sin embargo, te recomiendo que todo esto lo conviertas en scripts. Al final tendrás un conjunto de sencillos scripts con los que habrás automatizado parte de las tareas mas habituales que haces. Lo cierto es que o estás habituado a utilizar el terminal, y lo haces frecuentemente o difÃcilmente recordarás todas estas opciones.
Buen aporte, muchas gracias
Gracias, un saludo
Que bueno el artÃculo, me he quedado impresionado. Creà que iba a hablar sobre grep, wc, tee, dd, sed, awk y demás familia. Los voy a poner en práctica y aprendo un poco más sobre este mundo tan completo. Muchas gracias.
Hola VÃctor. El potencial que tiene es impresionante. Espero que lo disfrutes.
Un saludo.
Muy buen artÃculo. En los primeros ejemplos de renombrar falta el nombre original del archivo ( mv «$i» …)