Ejecutar comando sobre múltiples ficheros en directorios distintos con mismo nombre

Comentarios sobre el buen funcionamiento del sistema y como personalizarlo a tus necesidades.

Moderadores: doc, mcun

Responder
psk
Forista Nuevo
Forista Nuevo
Mensajes: 2
Registrado: Vie May 21, 2010 10:43 am

Ejecutar comando sobre múltiples ficheros en directorios distintos con mismo nombre

Mensaje por psk » Vie May 21, 2010 10:45 am

Hola a todos, este es mi primer mensaje en este foro.

Tengo que realizar una tarea que estoy casi seguro de
que podría hacer de forma automática pero no doy con el comando
adecuado.

Tengo una serie de directorios con esta estructura:

./dir/xxx/yyy/Maildir/

Hay unos 30 xxx distintos con unos 100 yyy dentro de cada uno (de ahí que busque algo automático y no tener que ir pasando a mano por todos los directorios.

Dentro de Maildir hay tres directorios: cur, new y tmp que necesito
vaciar (sin borrar el directorio en si mismo)

Estoy tratando de hacerlo con find, mediante su parámetro -exec, pero
no se porqué, el rm me da un fallo, como si no existiera la ruta que
find le pasa, pero el caso es que la ruta está bien... no entiendo qué
está fallando.

Ejecuto:

find ./dir -type d -name "new" -exec rm {}/* \;

Y me sale este error para cada resultado de find:

rm: cannot lstat './dir/xxx/yyy/Maildir/new/*': No such file or
directory

El caso es que si ejecuto:

rm ./dir/xxx/yyy/Maildir/new/*

sí, que me vacía el directorio.

¿alguien puede ayudarme? Me tiene loco este tema...
Avatar de Usuario
shicefgo
Forista Menor
Forista Menor
Mensajes: 53
Registrado: Lun May 10, 2010 1:00 am
Ubicación: Andalucía

Re: Ejecutar comando sobre múltiples ficheros en directorios distintos con mismo nombre

Mensaje por shicefgo » Vie May 21, 2010 12:27 pm

Hola.
Prueba a quitar el asterisco (y asegúrate de que no se borra el directorio, que no estoy seguro, sólo lo he probado con ls :D ).

find ./dir -type d -name "new" -exec rm {}/ \;

Saludos.
psk
Forista Nuevo
Forista Nuevo
Mensajes: 2
Registrado: Vie May 21, 2010 10:43 am

Re: Ejecutar comando sobre múltiples ficheros en directorios distintos con mismo nombre

Mensaje por psk » Vie May 21, 2010 1:27 pm

No funciona, rm no borra directorios.

He encontrado una forma alternativa:

find /dir –type d –name “new” –exec find {} –type f \; | xargs rm

Con el primer find obtenemos todas las rutas de los directorios "new" y sobre cada una ellas hacemos un nuevo find para localizar todos los ficheros que hay en cada directorio y los pasamos a rm mediante una tubería y el comando xargs.

Mi idea original era usar un segundo -exec en el segundo find con rm, pero me da unos errores, así que como con xargs me ha funcionado no me he mareado más.

Gracias shicefgo

Editado -- Vie May 21, 2010 5:03 am --

La solución comentada tiene un problema: Las rutas que contienen espacios no le llegan bien a rm.

xargs considera el fin de un parámetro cuando encuentra un espacio, por lo que si la ruta es /dir/ruta uno/cur, xargs hará que se ejecute:

rm /dir/ruta
rm uno/cur

Supongo que habrá alguna forma de arreglar esto, pero mientras la encuentro lo aviso por si alguien más quiere hacer lo mismo, que lo tenga en cuenta.

Editado -- Vie May 21, 2010 5:27 am --

Ya está, este creo que sirve:

find /dir –type d –name “new” –exec find {} –type f -print0 \; | xargs --null rm

Añadiendo el -print0 al segundo find, hacemos que el resultado lleve un caracter null al final de la cadena
Añadiendo --null a xargs, hacemos que el final de una cadena se considere el caracter null y no un espacio en blanco.
Avatar de Usuario
shicefgo
Forista Menor
Forista Menor
Mensajes: 53
Registrado: Lun May 10, 2010 1:00 am
Ubicación: Andalucía

Re: Ejecutar comando sobre múltiples ficheros en directorios distintos con mismo nombre

Mensaje por shicefgo » Vie May 21, 2010 2:09 pm

psk escribió:No funciona, rm no borra directorios.

Joer, qué fallo. ::lol::

Sólo hice la prueba con ls y funcionaba, no quise entretenerme en crear directorios y meter archivos para borrar.
Me alegro de que lo hayas conseguido. Con tu permiso, me lo anoto. :wink:

Saludos.
Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje