Archivo de la categoría: Linux

Mostrar el mapeo de puertos en virtualbox y los snapshots en linux

Crear el script con el siguiente contenido:

for i in $(vboxmanage list runningvms | awk -F "{" '{print $2}';)
do      
maquina="$i"
maquina=$(sed 's/.$//' <<< $maquina)
echo "$maquina"
vboxmanage showvminfo $maquina | grep 'Name\|NIC' | grep 'Name\|Rule'
done

Hacer el fichero ejecutable, por ejemplo si se llamaba listarPuertos.sh

chmod u+x listarPuertos.sh
Ejecutarlo
./listarPuertos.sh

Al ejecutarlo mostrará algo así:
29831584-8637-4550-9c32-40244879a10a
Name:                        Maquina 7.4
Storage Controller Name (0):            IDE
Storage Controller Name (1):            SATA
NIC 1 Rule(0):   name = Oracle Listener, protocol = tcp, host ip = , host port = 19750, guest ip = , guest port = 9750
NIC 1 Rule(1):   name = Rule 1, protocol = tcp, host ip = , host port = 8090, guest ip = , guest port = 8080
Name: 'Shared', Host path: '/home/user/1tbMec/vms/shared' (machine mapping), writable, auto-mount, mount-point: '/apps/compartido'
   Name: Antes de Activar Alfa (UUID: d1db4ea6-c092-47fa-9129-9a92927c0f59)
      Name: Antes de Cargar entorno gráfico K Workflow (UUID: 9d13d8de-7542-46e1-add1-ddf3075c9498)

Por ejemplo nos indica que el puerto 9750  de la máquina virtual Maquina 7.4 está publicado como 19750 o el 8080 (guest port) se mapea hacia el exterior como 8090 (host port).

Lectura de un fichero para usar su contenido como parámetro para otros comandos.

Leyendo el fichero que se indica como entrada en <soloNombres.txt:

Para cada línea la muestra en pantalla.

while read p; do echo “$p”; done <soloNombres.txt

Podemos completar el comando con un condicional del tipo, si existe el fichero haz…. Para ello reemplazamos el do echo$ del ejemplo anterior por la prueba de si existe o no un fichero.

if [ -f “nombre.CR2” ]; then echo “nombre.CR2”;fi;

El condicional if comprueba si [-f “nombre.CR2”] existe (verdadero) y en dicho caso ejecuta el “echo”

Si lo combinamos con el comando anterior y en lugar del “nombre.CR2” comprobamos si existe cada línea del fichero terminada en .CR2

while read p; do if [ -f “$p.CR2” ]; then echo “$p”;fi; done <soloNombres.txt

La ejecución imprimirá una línea por cada línea del fichero soloNombres.txt que exista en el directorio actual con la extensión .CR2

El condicional podemos completarlo para que haga más cosas, por ejemplo mover un fichero cuyo nombre coincida con la línea del fichero y que se encuentre en otra ruta al local y tenga extensión jpg al directorio actual y borre el fichero del directorio actual con extensión CR2

while read p; do if [ -f “/drives/z/otra/ruta/$p.jpg” ]; then cp “/drives/z/otra/ruta/$p.jpg” .; rm “$p.CR2”;fi; done <soloNombres.txt

En mi caso par construir el fichero soloNombres.txt he usado dos comandos en el directorio actual (donde se encuentran los CR2)

Para sacar la relación de los ficheros CR2, cada línea quedará como nombre.cr2

xxxxx.cr2

ls -lha *.cr2 |awk ‘{print $9}’ >cr2.txt

Para quedarme solamente con el nombre del fichero, sin la extensión:

cat cr2.txt |awk -F “.” ‘{print $1}’>soloNombres.txt

Reemplazo de una cadena en todos los archivos

Reemplazo de una cadena en todos los archivos que la contienen
Po ejemplo para reemplazar /opt/bitnami/common/ por /home/cmswp/deBitnami/common/

find . -name ‘*’ -exec sed -i “s/\/opt\/bitnami\/common\//\/home\/cmswp\/deBitnami\/common\//g” {} \;

Nota es necesario sustituir el “/” por “\/” es decir incluir el carácter de escape “\”.

Para reemplazar CabeceraListado por msgEs:

find . -name ‘*’ -exec sed -i “s/CabeceraListado/msgEs/g” {} \;

La búsqueda se hará en el directorio desde el que se ejecuta y en sus subdirectorios.

Comprimir multiples archivos de forma individual (cada uno en su correspondinete archivo comprimido)

Para comprimir los archivos que se encuentran en un mismo directorio y que responden a un mismo patrón. Ejemplo todos empiezan por miArchivoXX XX puede ser un número miArchivo01, miArchivo14, miArchivo87,,,,

for f in miArchivo??; do tar czvf $f.tar.gz $f; done

Lo que hace el comando: for f in miArchivo??; crea en memoria un vector con los nombre de los archivos que se corresponden con el patrón. Para referirse a dicho vector utiliza la variable f ($f más adelante).

A continuación hace lo siguiente: do tar czvf $f.tar.gz $f; es decir ejecuta el comando tar czvf $f.tar.gz $f; para cada elemento del vector creado en el paso anterior. Para cada uno de ellos reemplaza $f por el correspondiente valor del vector del paso 1. Ejemplo tar czvf miArchivo01.tar.gz miArchivo01 (comprimir el archivo miArchivo01 en miArchivo01.tar.gz………….)

done indica que debe de finalizar.