Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



martes, 10 de septiembre de 2019

viernes, 22 de septiembre de 2017

Como Renombrar Masivamente Archivos: Ejemplos de uso de RENAME




Como Renombrar Masivamente Archivos: Ejemplos de uso de RENAME






Renombrar un archivo es sencillo... pero cuando se trata de renombrar cientos.... la cosa varia. El uso del comando rename y de expresiones regulares nos sirven para simplificar dicha tarea.
"Una simple linea de comando puede conseguir en varios segundos el mismo resultado que haríamos manualmente en horas."

La sintaxis del comando rename es:

rename perlexpr [archivos]

Dónde:
  • perlexpr es una expresión regular en lenguaje Perl. (ver *)
  • [archivos] es la lista de archivos a los que afectará el comando.
Nota: 
Existen entornos gráficos de este comando (pyrenamer) pero muchas veces no tenemos acceso a entorno gráfico, y la terminal siempre la podemos usar, por ejemplo en entornos online de linux (ejemplo en c9.io) o cuando estamos trabajando directamente con servidores.
pyrenamer: entorno gráfico para el comando rename

Os dejo varios ejemplos explicados:
1) Queremos cambiar la extensión de los archivos .txt del directorio actual por .csv

$rename 's/\.txt/\.csv/' *.txt

Explicación:

  • 's/\.txt/\.csv/' es la expresión regular que dice "cambia .txt por .csv".
  • *.txt es la lista de archivos a los que hay que aplicarles el cambio.

       Nota: el caracter especial ".", se indica con "\."


2) Queremos añadir al principio del nombre de todos los ficheros .PDF el texto "01.03.Planos.":

$rename 's/^/01.03.Planos./' *.pdf

Explicación:

  • 's/^/01.03.Planos./'  es la expresión regular que dice "al principio pon el texto 01.03.Planos."
  • *.pdf es la lista de archivos a los que hay que aplicarles el cambio.

3) Queremos sustituir los espacios de los nombres por el caracter guión bajo, osea " " cambiar a "_" de los archivos .PDF
$rename 'y/\ /_/' *.pdf 

Explicación:

  • 'y/\ /_/'  es la expresión regular que dice "cuando aparezca un espacio sustitúyelo por un guion bajo _"
  • *.pdf es la lista de archivos a los que hay que aplicarles el cambio.

4) Queremos quitar el contenido que este entre parentesis de los nombes de los ficheros, incluido el propio parentesis. Por ejemplo "hola(1).txt" renombrarlo a "hola.txt"

$rename 's/\(.*\)//g' *

Explicación:
  • 's/\(.*\)//g'  es la expresión regular que dice "elimina el contenido entre parentesis incluido los parantesis"
  • * a todos los ficheros
5) Tenemos varios archivos con este  formato  de nombre: "Audio XX-Pista de audio By hola.mp3", siendo XX el numero de la canción. Se desea eliminar del nombre la parte de "Audio " y " By hola"

$rename 's/Audio //g' *.mp3
$rename 's/ By hola//g' *.mp3

Explicación:
  • Aplicamos 2 veces el comando, una para eliminar la palabra "Audio " y otra para eliminar " By hola"
  • 's/Audio //g' eliminamos la palabra "Audio "
  • 's/ By hola//g' eliminamos las palabras " By hola"
  • *.mp3: Aplicamos a todos los ficheros .mp3
http://mercurio.ugr.es/pedro/tutoriales/cursos/perl/expresiones.htm


(*) Extra:

Construyendo expresiones regulares complejas:


.cualquier caracter salvo el de retorno de carro
^indica que coincida al principio de la línea
$indica que coincida al final de la línea
*aparezca 0 o más veces el caracter que lo precede
+aparezca 1 o más veces el caracter que lo precede
?aparezca 0 o 1 veces el caracter que lo precede
[]indica un conjunto de caracteres que pueden aparecer
[^]indica un conjunto de caracteres que no pueden aparecer
|indica una disyunción, aparezca una de las opciones
()agrupa una serie de patrones en un simple elemento
{n}que coincida exactamente n veces
{n,}que coincida al menos n veces
{n,m}que coincida al menos n veces y no mas de m
\nun retorno de línea
\tun tabulador
\wun caracter alfanumérico (equivale a [a-zA-Z0-9_])
\Wun caracter no alfanumérico (equivale a [^a-zA-Z0-9_])
\dun caracter numérico (equivale a [0-9])
\Dun caracter no numérico (equivale a [^0-9])
\sun caracter de espaciado (espacio, tabulador, nueva línea, etc)
\Sun caracter NO de espaciado
\bcoincida con los límites de una palabra
\Bcoincida con el interior de una palabra
\033un número octal (el 033)
\x1bun número hexadecimal (el 1B)
\| \[ \] \( \) \* \^ \/ \\ etcrepresentan | [ ] ( ) * / \ (hay que escapar estos caracteres especiales)


Veamos algunos ejemplos ilustrativos:
d.luna "d" seguida de un caracter cualquiera y una "l" (del, dal, dzl, d5l, etc)
^funa "f" al principio de la cadena (fofo, farfolla, f35, etc)
^hol"hola" al principio de la cadena (hola, holita, etc)
e$una "e" al final de la cadena (este, ese, etc)
te$"te" al final de la cadena (este, paquete, etc)
ind*"in" seguido de cero o más caracteres "d" (in, ind, indd, etc)
.*cualquier cadena, sin retorno de carro
^$una cadena vacia
[qjk]una "q", o una "j" o una "k"
[^qjk]no sea "q", o una "j" o una "k"
[a-z]cualquier letra entre la "a" y la "z"
[^a-z]no sean letras minúsculas
[a-zA-Z]una letra minúscula o mayúscula
[a-z]+una secuencia no vacia de letras minúsculas
f.*cacoincide con p.e. "fca", "foca", "flaca", "flor vaca", etc
f.+cacoincide con los anteriores salvo con "fca"
fe?acoincide con "fa" y "fea"
^[ \t]*$una linea en blanco, o combinaciones de espacios y tabuladores
[-+]?\d*\.?\d*lo mismo que [-+]?[0-9]*\.?[0-9]* (números decimales)
( (\d{1,2})\/(\d{1,2})\/(\d{1,4}) )una fecha en el siguiente formato DD/MM/AAAA (13/02/1674 ó 8/2/23 pero también 99/99/9999)
pepe|juano "pepe" o "juan"
(pe|hue)coso "pecos" o "huecos"
(da)+o da o dada o dadada ...
[01]un "0" o un "1"
\/0una división por 0
\/ 0una división por 0 con un espacio
\/\s0una división por 0 con un caracter de espacio (espacio, tabulador, retorno de carro)
\/ *0una división por 0 con varios espacios
\/\s*0una división por 0 con posibles caracteres de espaciado
\/\s*0\.0*una división por 0 con posibles caracteres espaciado y acepta "0." "0.0" "0.00" etc
fia|fea|fuacoincida con "fia", "fea" o "fua"
f(i|e|u)acoincida con "fia", "fea" o "fua"
(fia|fea|fua)equivale a los dos anteriores
[fia|fea|fua]equivale a [fiaeu]


miércoles, 20 de septiembre de 2017

[Truco] Como convertir varios documentos .doc en .pdf



[Truco] Como convertir varios .doc en .pdf

Desde hace tiempo MS Word tiene la función de "guardar como" en formato .PDF, pero ¿que pasas si tienes muchos archivos .DOC y los tienes que convertir a PDF? ¿que hay que hacerlo uno a uno? ¿se podría hacer de una manera automática y todos a la vez? Linux al rescate....

Este es el problema que me he encontrado esta mañana, ya que tengo un CD con cientos de archivos MS Word (.doc) y los tengo que convertir en PDF.  Encontré internet varias páginas que lo convertían "online", pero o tenia que ir uno a uno o tenía que registrarme. Al final no me convencía la idea, y me fui a hacerlo con gnu/linux, con la consola Bash, con un pequeño script.

Me cree el siguiente script:
for archivoActual in $(ls *.DOC);do  unoconv -f pdf $archivoActualdone
Lo que hace es:
A todos los archivo terminados en la extensión .DOC del directorio donde se encuentre el script, le va a aplicar el comando unoconv, creando un fichero con el mismo y con la extensión .PDF

Como veis usa el comando unoconv, que se encarga de la conversión, os dejo el enlace donde se explica con más detalle sus opciones:
https://docs.moodle.org/all/es/Universal_Office_Converter_(unoconv)

Para instalar unoconv, por si no lo teneis:
sudo apt-get install unoconv

Notas:

  • Para aplicar el script, tuve que darle permisos de ejecución y crear una carpeta temporal en mi directorio de linux donde copiaba los ficheros .DOC y ejecutaba en el script. 
  • Algunos nombres de ficheros .DOC, los renombre, por ejemplo, les quite los espacios, sustituyéndolos por guion bajo "_", para que el script funcionara sin problemas.
  • Como linux distingue entre mayúsculas y minúsculas, si la extensión del fichero fuera .doc (y no .DOC), el script cambiaría a:
for archivoActual in $(ls *.doc);do  unoconv -f pdf $archivoActualdone


Os dejo el enlace de descarga del script: https://goo.gl/C76uuF

Saludos