Bucles en la terminal

Hace poco necesitaba yo borrar, en una estructura de directorios, todos los ficheros cuya extensión fuera .class. Estas tareas suelen ser un tedio, pero muy fáciles de solucionar si sabes un poco de shell scripting. El ejemplo es el siguiente:

$ for i in `find . -name '*.class'` ; do echo "Borrando $i ; rm $i ; done
Esto haría la magia en una terminal con intérprete de mandatos bash. Si usais tcsh como yo, la cosa es un poco distinta:

$ foreach i ( ` find . -name '*.class' ` )
foreach? echo "Borrando $i"
foreach? rm $i
foreach?end

Como se ve, en tcsh es un poco menos intuitivo, ya se sabe que para programar, bash es bastante mejor :-), pero el resultado es equivalente.

11 Respuestas a “Bucles en la terminal”


  1. Icono Gravatar 1 YoNoSoyTu 22 Sep, 2006, 4:58 pm

    Para ambas shells (y muchas más)…

    find . -name '*.class' -exec rm \{\} \;

    De na’.

    PD: Ejecutar el find una vez sin el exec para ver que se va a borrar por si las flies.

  2. Icono Gravatar 2 deigote 25 Sep, 2006, 9:17 am

    ¡Oh Dios! ¡El spam ha empezado! malditos… ¡ah, por cierto! Gracias por el consejo, no conocía la opción -exec. De todas formas lo que yo quería era un sitio para anotar cómo se hacen los bucles en tcsh, que siempre se me olvida (y ya de paso, en bash, aunque de este sí que me acuerdo ;-)).

  3. Icono Gravatar 3 YoNoSoyTu 25 Sep, 2006, 2:01 pm

    Pues yo nunca acierto donde poner los dichosos punto y coma, así que ahora lo tengo apuntado en algún sitio gracias a ti. :)
    Gracias.

  4. Icono Gravatar 4 deigote 25 Sep, 2006, 2:03 pm

    Lo normal es que se pongan donde iría un salto de línea, aunque por alguna razón el do se lo salta a la torera. De nada :-D

  5. Icono Gravatar 5 deigote 21 Nov, 2006, 10:34 am

    Otro ejemplo:
    for i in `ps aux | grep deigote | awk '{ print $2}'` ; do echo "Matando $i" ; kill -9 $i ; done

    Para matar a todos los procesos del usuario deigote.

  6. Icono Gravatar 6 deigote 21 Dec, 2006, 3:57 pm

    ls | awk '{ m = $0 ; n = "2" $0; system("mv \"" m "\" \"" n "\"")}'
    Para añadir un 2 al principio del nombre de cada fichero del directorio actual (ojo con alias del tipo ls = ls –color).

  7. Icono Gravatar 7 deigote 24 Dec, 2006, 7:44 pm

    ¡Ups! eso iba aquí

  8. Icono Gravatar 8 deigote 21 Jan, 2008, 11:01 am

    for i in `ls` ; do cd $i; mv *ront*.jpg cover.jpg ; cd .. ; done

    Para cuando tengamos una colección de discos con carátulas tipo Disco chupi guay front.jpg y queramos unificarlas todas a cover.jpg :wink:

  9. Icono Gravatar 9 kikeenrique 8 Feb, 2008, 4:04 am

    Para matar a todos los procesos del usuario deigote….
    root@pepu:~$ pkill -u deigote
    esta en el paquete procps, que supongo que será casi estándar.
    root@pepu:~$ dpkg -S pkill
    procps: /usr/share/man/man1/pkill.1.gz
    procps: /usr/bin/pkill

  10. Icono Gravatar 10 deigote 8 Feb, 2008, 10:21 am

    Gracias por el apunte :cool:

  1. 1 spam tocagüevos Dirección Trackback a 8 Dec, 2006, 10:52 am

Añade un Comentario

XHTML: Puedes usar estas etiquetas <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> :