Bash: Ejemplos
Bash: Ejemplos
Por Paco Aldarias Raya
Impreso: 1 de mayo de 2007
Email: pacolinux arroba inicia punto es
Web: http://pagina.de/pacodebian
Con Linux Debian. En Valencia (España)
El documento tiene version .html, y .pdf, cambiando en el navegador la
parte final podrás acceder a ambos.
Este documento es de libre reproducción siempre que se cite su fuente.
Realizado con: LATEX
Índice
Índice
1. Introducción
2. bash
3. Arbol de directorios
4. Renombrar ficheros
5. Borrar los archivos contenidos en un fichero
6. Borrar los ficheros que comiencen con p en el directorio ac-
tual y en todos sus subdirectorios
7. Mover los ficheros
8. Para descomprimir todos los archivos zip de una carpeta en
otra
1
1
1
1
2
3
3
3
3
Por Paco Aldarias
1/17
Bash: Ejemplos
9. Copiar un fichero en otro poniendo la fecha y hora
10.Analizar el arranque y realizar algo
11.Enviar n mensajes de correo
12.Clonar usuarios
13.Sustituir un texto por otro
13.1. sec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.2. tr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14.Quitar los blancos de los nombre de los archivos
15.Buscar todas las imagenes y renombrarlas por la hora actual
16.Renombrar canciones
17.Sacar las ips de las máquinas conectadas en la red indicada
17.1. opcion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17.2. opcion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17.3. opcion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18.Sacar el nombre de la maquina o dns
19.Reducir fotos
20.Cambiar todos los enlaces de las paginas de una carpeta por
otro enlace
21.Reemplazar un texto por un fichero
22.Quitar un texto en un fichero
23.Obtener la edad
24.Recursos del pc con bash
25.Script del dns dinamico cdmon
26.Bibliografía
4
4
5
5
6
6
6
6
6
7
8
8
8
9
9
10
10
10
11
12
12
13
17
Por Paco Aldarias
2/17
Bash: Ejemplos
1.
Introducción
2. bash
Vamos a ver ejemplo de uso del bash
3. Arbol de directorios
Para obtener el arbol de directorios.
func_recursiva()
{
for OBJ in *
do
if [ -L "${OBJ}" ]
then
#echo "[e] ${OBJ} <-- Enlace"
continue
fi
(
if [ -d "${OBJ}" ]
then
#echo "[d] ${OBJ} <-- Directorio"
cd "${OBJ}"
pwd
#du -s -c -h
func_recursiva
fi
)
#echo "[f] ${OBJ} <- Fichero"
done
}
func_recursiva
Por Paco Aldarias
3/17
Bash: Ejemplos
4. Renombrar ficheros
Elimina una extensión .tar final de archivo.tar.bz2.tar para dejarlo en
archivo.tar.bz2.
1. Suponiendo que el nombre del archivo no contenga ”.2 que los archivos
esten en el directorio en el que ejecutes esto:
for nombre in *.tar.bz2.tar; do
nuevo_nombre=‘echo $nombre | gawk -F. ’{print $1"."$2"."$3}’‘
mv $nombre $nuevo_nombre
done
2. Este guión, con la opción -ss, elimina el sufijo indicado de los objetivos:
for fich in *.tar; do mv fich $(nombase -ss.tar $fich);done
3. El signo del dolar indica el final de línea; la construcción s/x/y/ es la
clásica utilizada para sustituir x por y:
rename ’s/.tar$//’ *.tar
5. Borrar los archivos contenidos en un fiche-
ro
Esto borra los ficheros contenidos en fichero.txt, q es de la forma /carpe-
ta/fichero1.txt /carpeta/fichero2.txt
1. xargs -i rm "{}" < fichero.txt
2. for linea in ’cat fichero.txt’
do
rm $linea;
done
Por Paco Aldarias
4/17
Bash: Ejemplos
6. Borrar los ficheros que comiencen con p en
el directorio actual y en todos sus subdi-
rectorios
find ./ -name "p*" -exec rm -f {} \;
find -name ’p*’ -type f -exec rm {} \;
7. Mover los ficheros
Que contienen el texto Way a la carpeta /wind/musica/way/:
find /lector -name "*Way*" -exec mv {} /wind/musica/way/ \;
8. Para descomprimir todos los archivos zip
de una carpeta en otra
echo DESCOPRIMIENDO ZIPS
echo Ejemplo: ./unzip.sh /origen/ /destino
cd $1
for i in $(ls *.zip); do
f=$(echo $i | cut -d. -f1);
echo [*] Descomprimiendo $i en $2$f;
mkdir $1$f;
cd $1$f;
unzip $1$i -d $2/$f;
done
9. Copiar un fichero en otro poniendo la fe-
cha y hora
echo Ejemplo: ./copiar.sh fichero
echo copiando $1 $1$(date +%d-%m-%Y-%H-%M)
cp $1 $1$(date +%d-%m-%Y-%H-%M)
Por Paco Aldarias
5/17
Bash: Ejemplos
10. Analizar el arranque y realizar algo
Se trata de tener un arranque del dma controlado.
Me surgio la necesidad de que al arrancar mi disco duro, el cual no iba
bien. Me salía este error:
Oct 9 12:24:42 pacohost kernel: hda: dma_intr: error=0x84
{ DriveStatus ErrorBadCRC }
Oct 9 12:24:42 pacohost kernel: hda: dma_intr: status=0x51
{ DriveReady SeekComplete Error }
La idea era comprobar que si en el arranque sale este error desactive el
dma, paraque no salga mas este error.
Veamos los ficheros que utilizo:
Aquí analizo la salida de dmesg, si contiene la cadena status, aplico el
script hd.sh que desactiva el dma.
cat /etc/rc2.d/S01ifhd.sh
#!/bin/bash
echo ANALISIS DMA:
if [ -n "$(dmesg | grep ’status=0x51’)" ]; then
echo "Error de dma"
/root/hd.sh
else
echo OK DMA
fi
cat /root/hd.sh
hdparm -k1 -c0 -d0 -X64 /dev/hda
11. Enviar n mensajes de correo
Vamos a ver la forma de enviar n mesajes a un email:
Veamos el script:
echo Ejempplo: ./mailbucle.sh 10
[email protected]
echo enviando $1 mensajes a $2
for i in ‘seq 1 $1‘;
Por Paco Aldarias
6/17
Bash: Ejemplos
do
#echo "SPAMMMMMMMMMMMMMMMM" | mail -s "" paco
mail -u usuario -s "encabezado" $2 < kk.txt
Siendo kk.txt el fichero q se envia.
12. Clonar usuarios
Esto permite copiar todos los ficheros de un usuario en /etc/skel, para q
al crear un usuario tenga la misma configuración.
echo Ejemplo -siendo root-: ./skel.sh paco
usu=$1
echo Copiando ficheros del usuario $usu
cd /home/$usu
tar cpBf /etc/skel/$usu.tar.gz .
echo Extrayendo esqueleto del usuario $usu
cd /etc/skel/
tar xvBpf $usu.tar.gz
rm $usu.tar.gz
Usando ssh:
ssh usuario@maquina_remnota tar -cvpSf - / | tar -xvpf -
13. Sustituir un texto por otro
13.1.
sec
Sustituye .o por .ko
cat util | sed -e "s/.o/.ko/" > util1
mv util1 util
13.2.
tr
cat xx
abc def
ghi abc
jkl mno
abc pqr
Por Paco Aldarias
7/17
Bash: Ejemplos
tr abc 123 < xx
123 def
ghi 123
jkl mno
123 pqr
14. Quitar los blancos de los nombre de los
archivos
for i in *; do
nuevo=‘echo $i | sed -s ’s/\ //g’‘;
mv "${i}" ${nuevo};
done
O tambien así:
for i in *; do mv "$i" "‘echo $i | tr ’ ’ ’_’‘"; done
15. Buscar todas las imagenes y renombrar-
las por la hora actual
El script renombraba las imagenes en función de la fecha y hora, y en
el caso de que varias fotos fueran hechas en en mismo segundo, añadía una
letra al nombre (a, b o c).
#! /bin/bash
shopt -s extglob # for improved file pattern matching
for imgname in *.+(jpg|JPG);
do
newname="$(head $imgname|strings|sed -n ’/[0-9]\{4\}\:.*/ {s/ /+/g; s/:/-/g; s/$/.jpg/; p}’|uniq)"
# if there is already another file with the same name append an extension (b or c).
# Just thinking a bit more this can be improved, but IMHO it will work OK:
if ls ${newname%%.jpg}* &> /dev/null; then
[ -f ${newname%%.jpg}b.jpg ]; then newname=${newname%%.jpg}c.jpg
if
elif [ -f ${newname} ]; then newname=${newname%%.jpg}b.jpg
fi
fi
mv ${imgname} ${newname}
Por Paco Aldarias
8/17
Bash: Ejemplos
done
16. Renombrar canciones
Vamos a cambiar de nombre a muchos archivos, son archivos mp3 y la
estructura es la siguiente:
Grupo - cancion - num - Disco.mp3 (el grupo tiene espacios en blanco)
y quiero que termine en num-cancion.mp3.
Script para bash
for i in *.mp3
do
titulo=‘id3 -lR $i | grep -e "^Title" | cut -f2- -d ’ ’‘
artista=‘id3 -lR | grep -e "^Artist" | cut -f2- -d ’ ’‘
album=‘id3 -lR | grep -e "^Album" | cut -f2- -d ’ ’‘
num=‘id3 -lR | grep -e "^Track" | cut -f2- -d’ ’‘
mv "$i" "$artista-$titulo-$num-$album.mp3"
done
Lees directamente de cada fichero mp3 la información que tiene para
renombrar el archivo con su contenido
17. Sacar las ips de las máquinas conectadas
en la red indicada
17.1.
opcion
# Nmap-pacolinx
# Este script saca las ips de las máquinas conectadas en la red indicada
# Por Paco Aldarias
# Fecha: 15.05.04
# pacolinux arroba inicia punto es
# Valencia - España
t=temp.txt # fichero temporal
f=nmap.txt # fichero resultado
r=192.168.0.1-3
# rango de busqueda de la red
echo [Nmap-pacolinx] Maquinas conectadas en la red $r
Por Paco Aldarias
9/17
Bash: Ejemplos
nmap -sP -n $r > $t
lineas=‘wc -l < $t‘ # cogemos la linea
I=3
while [ $I -lt $lineas ] # recorremos todas la lineas menos la ultima
do
linea=‘sed -n ${I}l $t‘
ip=‘echo $linea | cut -d" " -f2‘
echo $ip >> $f
I=‘expr $I + 1‘
done
cat $f
rm -f $t $f
17.2.
opcion
esto tb se puede hacer asi:
nmap -sP 192.168.0.* |grep appears |cut -f3 -d" " |tr \( " " |tr \) " " \
> nmap.txt
Esto filtra la linea q tienes las ips:
nmap -sP 192.168.0.* |grep appears
Es decir saca esto:
Host paco (192.168.0.1) appears to be up.
Esto saca la ip, q la 3ra cadena:
nmap -sP 192.168.0.1 |grep appears |cut -f3 -d" "
Es decir saca esto:
(192.168.0.1)
La última parte reemplaza los parentesis por blancos:
nmap -sP 192.168.0.* |grep appears |cut -f3 -d" " |tr \( " " |tr \) " "
Es decir saca esto: 192.168.0.1
17.3.
opcion
nmap -sP 192.168.0.0-1 | awk ’/appears to be up/ {print $3}’ | sed ’s/[()]//g’ \
> nmap.txt
Por Paco Aldarias
10/17
Bash: Ejemplos
18. Sacar el nombre de la maquina o dns
La orden es host x.x.x.x siendo x.x.x.x la ip.
Ejemplo:
#host 192.168.0.1
Name: paco
Address: 192.168.0.1
Queremos que saque el nombre, en este paco seria:
paco
Se puede hacer asi:
host 192.168.0.1 | grep Name | cut -f2 -d " "
o tb así:
host 192.168.0.1 | awk ’/Name: / {print $2}’
19. Reducir fotos
apt-get install libjpeg-progs
mkdir ../fotos-reducidas
for a in ‘ls *.jpg‘; do
djpeg -scale 1/4 $a | cjpeg -q 95 > ../fotos-reducidas/$a
done
20. Cambiar todos los enlaces de las paginas
de una carpeta por otro enlace
Esto cambia el enlace http://pagina.de/pacodebian por http://www.iespana.es/pacolatex
en todas las paginas web del directorio.
find . -type f -name \*.html -print |
Comentarios de: Bash: Ejemplos (0)
No hay comentarios