Artículos etiquetados "Linux"

Descomponer una ruta en directorios, nombre de archivo y extensión en Bash

Una tarea que puede ser bastante común a la hora de escribir scripts o aplicaciones que trabajen con el sistema de archivos es la necesidad de descomponer una ruta completa del tipo «/directorio/subdirectorio/…/…/archivo.extension» para obtener por separado el nombre de archivo, la extensión y la ruta de directorios. De hecho, fue una de las necesidades que me ha surgido estos días, escribiendo un Shell Script un tanto grande en el que necesitaba obtener el nombre de un archivo de una ruta completa así como la estructura de directorios hasta el mismo.

Dado que me suele gustar, al escribir scripts de cierto tamaño, dividirlos por bloques de código independientes, voy a publicar este como una solución aislada para solventar el problema de descomponer rutas aunque cuando lo volváis a ver en el script que aún no he terminado aparecerá como una función por la comodidad que representan y porque facilitan mucho la lectura del código en scripts de muchas lineas. Sin más preámbulos, vamos manos a la obra:

Dado que este código ahora es independiente, he realizado algunos cambios como que tome la entrada de datos a modo de parametros tras el nombre del script por lo que la ruta a descomponer, deberá ir tras el nombre del script en lo que seria el parámetro $1, es decir, tendriamos que pasárselo de la siguiente manera:

./script.sh /ruta/que/queramos/descomponer/archivo.extension
Por el mismo motivo, lo he dispuesto de forma que la salida del mismo sea la salida estándar mostrando el valor de cada una de las variables que intervienen en el proceso.

También he comentado las lineas relevantes ya que creo que será mejor explicar cada una de las lineas en el mismo punto donde aparece. Así pues, este es el script:

 



#!/bin/bash
# Script para descomponer una ruta completa a un archivo o directorio, obteniendo
# el nombre de archivo y extensión (si existen) y ruta hasta los mismos
for RutaCompleta in $1
do
# Comenzamos extrayendo la parte derecha desde el ultimo caracter "/", es decir, el archivo
NombreArchivo="${RutaCompleta##*/}"
# Longitud de la ruta es el total de caracteres menos el largo del nombre de archivo
LargoRuta="${#RutaCompleta} - ${#NombreArchivo}"
# Extraermos la ruta desde el caracter 0 hasta el caracter final de largo de ruta
RutaSola="${RutaCompleta:0:$LargoRuta}"
# Lo siguiente es extraer nombre de archivo
NombreSolo="${NombreArchivo%.[^.]*}"
# Extension se obtiene eliminando del nombre completo el nombre mas el punto
Extension="${NombreArchivo:${#NombreSolo} + 1}"
# Las 2 lineas anteriores fallan si no hay extension por lo que es necesario comprobar que no
# se de el caso de que haya extension pero no nombre ya que en ese caso la ext seria el nombre
if [[ -z "$NombreSolo" && -n "$Extension" ]]; then
NombreSolo=".$Extension"
Extension=""
fi
done
# Este es el resultado del script
echo
echo "Este es el resultado del script:"
echo
echo La ruta completa es:
echo $RutaCompleta
echo
echo "Ruta.........: \"$RutaSola\""
echo "Nombre.......: \"$NombreSolo\""
echo "Extension....: \"$Extension\""
echo


Si lo ejecutamos, la salida del mismo, según está, sería similar a esto
:

 


$ ./descomp.sh /dir1/subdir1/subdir2/archivo.txt

Este es el resultado del script:

La ruta completa es:
/dir1/subdir1/subdir2/archivo.txt

Ruta………: «/dir1/subdir1/subdir2/»
Nombre…….: «archivo»
Extension….: «txt»


Ahora bien, hay que tener en cuenta que si lo vamos a utilizar como una función llamada desde otro script o simplemente como un bloque de código incrustado entre las lineas, habría que hacerle algunos cambios, pero dado que lo estoy utilizando en otro script que voy a publicar aquí también, no lo explicaré aún ya que es cuestión de tiempo que me toque hacerlo.


 

 

leer más

Usar «alias» y crear comandos personalizados en Linux

.
El tema de este artículo es configurar de forma sencilla comandos personalizados. Esto, si lleva tiempo o está acostumbrado a manejar sistemas Unix/Linux (Mac es Unix así que también es aplicable) ya lo conocerá ya que esta miniguía está destinada a usuarios nóveles en dichos sistemas.

¿A que me refiero con personalizar comandos? pues me refiero a los casos que al usar linux se echan de menos los comandos usados en Ms-Dos que, a pesar de que existan en Linux y sean más potentes, tienen nombres diferentes y obliga al usuario a adaptarse para realizar las tareas de forma rápida.

¿Pero no son las máquinas las que se tienen que adaptar a los hombres? Pues sí (Aunque bueno, en esa guerra todos cedemos y nos adaptamos mutuamente 😉 ). El caso es que podrá «adaptar» su sistema linux para que use los comandos con el nombre que usted quiera (Salvo que sea el nombre de otro comando ya que incluso un alias puede llamarse igual que el comando que invoca) e incluso podrá configurar varios nombres para un mismo comando que aplique diferentes parámetros. Todo este documento se aplica a la consola más utilizada en Linux, aunque existen varias. Esta consola recibe el nombre de Bash (Bourne Again Shell)
Para realizar esto, tan solo hay que hacer uso de un comando de Linux llamado «alias» que nos permitirá crear un «nombre» para el comando que queramos junto con sus parámetros. Así pues si echa de menos el archiconocido «dir» de MS-Dos y no se acostumbra al uso de «ls» podrá crear un alias para adaptarlo de esta manera:

usuario@maquina# alias dir=’ls’

De esta forma, cada vez que usemos el comando «dir» que antes no existía, ahora nos utilizará el comando «ls» a través de él y, por supuesto, también se le pueden aplicar parámetros a un alias como en el siguiente ejemplo:

usuario@maquina# alias DirTexto=’ls -l *.txt’

En este caso, cuando ejecutemos DirTexto (Recuerde que Linux diferencia el uso de mayúsculas y minúsculas) lanzará el comando «ls» para mostrar únicamente los archivos de extensión txt. El parámetro «l» es para que en el listado de los archivos, nos muestre también los permisos, tamaño, propietario y nombre de cada uno de los archivos.

Un ejemplo un poco más práctico sería:

usuario@maquina# alias cdr=’mount /dev/hdc /mnt/cdrom -t iso9660′

Esto nos montaría automáticamente la unidad de cd con solo escribir cdr.

Ahora bien, todo esto es muy práctico pero según lo conoce ahora mismo pierde toda la efectividad ganada ya que cada vez que inicie la consola tendrá que aplicar los alias necesarios porque no los recordará de una sesión a otra. ¿Como solucionar esto y hacer que los alias que configuremos sean para siempre? Pues estos son los pasos y tenga en cuenta que, para que se apliquen todas las modificaciones que se realicen sobre el archivo .bashrc, es necesario reiniciar la consola Bash, es decir, cerrarla por completo y volver a abrirla. Dicho esto, pasamos a las diferentes posibilidades y sus pasos:
Configuración de alias para un solo usuario

Si lo que queremos es configurar unos alias para un solo usuario, tendremos que editar el archivo .bashrc como vemos en el ejemplo:

usuario@maquina# vi $HOME/.bashrc

Una vez abierto bastaría con añadir al final del mismo las lineas de alias que quisiera. Como nota, en el ejemplo uso el editor Vi que para los menos experimentados puede resultar un poco complicado. Puede recurrir a cualquier otro editor para realizar la apertura del archivo, como por ejemplo nano o joe, que son bastante más sencillos.
En el caso de solo querer configurar los alias para el usuario root, el archivo a editar sería:

usuario@maquina# vi /root/.bashrc

Podría darse el caso, aunque no sería lo más común, que no se apliquen los alias o las modificaciones que se esté realizando en el archivo .bashrc. En ese caso es posible que haya que editar el fichero .bash_profile y comprobar que esté habilitado el uso del archivo de configuración .bashrc como en el siguiente ejemplo:

# include .bashrc if it exists

if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi

Estas lineas comprueban que exista el archivo .bashrc para, que si es así, lo use como configuración personalizada

Configuración de alias para TODOS los usuarios
En cambio, si lo que desea es configurar unos alias fijos para cualquiera de los usuarios del sistema, el archivo a editar, estará en otra ruta distinta como vemos en el ejemplo:

usuario@maquina# vi /etc/bashrc

Busque al comienzo del archivo las lineas:

# System-wide functions and aliases
# Enviroment configuration on /etc/profile

Y tras ellas podrá añadir los alias que quiera que sean comunes a todos los usuarios.

Como apunte, si se diese el caso de tener que eliminar un alias, el comando para eliminarlo sería unalias:

usuario@maquina# unalias DirTexto (esto eliminaría el alias DirTexto creado anteriormente)

Tenga en cuenta que si los alias están aplicados en el archivo .bashrc o en el bashrc, cuando inicie sesión en la consola de nuevo volverán a aparecer.

.

leer más