🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: es.comp.os.linux.programacion
8 messages
8 total messages Started by Javier M Mora (jamarier) Fri, 29 Jul 2005 00:09
(Bash) borrando directorios vacios recursivamente
#1819
Author: Javier M Mora (jamarier)
Date: Fri, 29 Jul 2005 00:09
42 lines
2414 bytes
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

haciendo un scriptcillo en bash, me encuentro con un arbol de
directorios que puede tener directorios vacios.

Quiero borrar dichos directorios vacios y si al borrar un directorio su
directorio queda igualmente vacio este tambien ha de borrarse, y as�
hasta que todos los directorios que queden est�n con al menos un
fichero/directorio.

tengo varios elementos en la mano, pero no se muy bien como conjugarlos:

rmdir s�lo borra si est� vac�o, as� que como primera aproximaci�n se me
ocurri�:

find -type d -exec rmdir '{}' ';'

a parte de generar muchos errores (que se pueden eliminar usando la
opci�n: --ignore-fail-on-non-empty) no hace el proceso recursivo. De
hecho, find encuentra los ficheros de padres a hijos y no al contrario
que ser�a lo ideal. 

Por otra parte, el arbol de directorios no est� limitado en su
profundidad as� que repetir el comando n veces, no valdr�a, porque no
podemos asegurar que tenga una profundidad de directorios vacios n+1.

Estoy abierto a sugerencias.

atte. javier m mora

- -- 
	Javier Maria Mora Merchan
	(GPGP) Key ID: 0x794F3D83

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)

iD8DBQFC6XPApRHCj3lPPYMRAvVFAKCtzooKaiQb301xvSxg5Ckj+sILrACfe123
AmkXyoX+/pW0zSLA5Juiw74=
=6s0D
-----END PGP SIGNATURE-----
Re: (Bash) borrando directorios vacios recursivamente
#1820
Author: Carlos
Date: Fri, 29 Jul 2005 01:44
23 lines
1599 bytes
Javier M Mora (jamarier) wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> haciendo un scriptcillo en bash, me encuentro con un arbol de
> directorios que puede tener directorios vacios.
> 
> Quiero borrar dichos directorios vacios y si al borrar un directorio su
> directorio queda igualmente vacio este tambien ha de borrarse, y as�
> hasta que todos los directorios que queden est�n con al menos un
> fichero/directorio.
> 
> tengo varios elementos en la mano, pero no se muy bien como conjugarlos:
> 
> rmdir s�lo borra si est� vac�o, as� que como primera aproximaci�n se me
> ocurri�:
> 
> find -type d -exec rmdir '{}' ';'

find -depth -type d ... etc

Suerte.
-- 
Re: (Bash) borrando directorios vacios recursivamente
#1823
Author: Iván Sánchez Ortega
Date: Fri, 29 Jul 2005 07:27
50 lines
2864 bytes
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Javier M Mora (jamarier) dixit:

[...]
> rmdir s�lo borra si est� vac�o, as� que como primera aproximaci�n se me
> ocurri�:
> 
> find -type d -exec rmdir '{}' ';'
[...]
> Por otra parte, el arbol de directorios no est� limitado en su
> profundidad as� que repetir el comando n veces, no valdr�a, porque no
> podemos asegurar que tenga una profundidad de directorios vacios n+1.

Creo que la soluci�n pasa por ordenar los resultados del find, de tal manera
que el rmdir borre primero los hijos y despu�s los padres... Un sort -r
(--reverse) hace el truco...

find -type d | sort -r

Ahora hay que pasarle esas l�neas, una a una, como par�metro a un rmdir
- --ignore-fail-on-non-empty ... Pero como mis dotes de programaci�n en bash
son pr�cticamente nulas estoy pr�cticamente seguro de que esto *no*
funciona:

for i in `find -type d | sort -r` do rmdir $i; done;


Seguro que alg�n monstruo de la programaci�n en bash me dice c�mo se har�a
bien.... porfaporfaporfaplis O:-)


Ciao,
- -- 
- ----------------------------------
Iv�n S�nchez Ortega -ivansanchez-arroba-escomposlinux-punto-org

http://acm.asoc.fi.upm.es/~mr/ 
Proudly running Debian Linux with 2.6.11-1-k7 kernel, KDE3.4.0, and PHP
5.0.4-0.10 generating this signature.
Uptime: 09:19:22 up 7 days, 26 min, 2 users,  load average: 1.48, 2.00, 1.58

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)

iD8DBQFC6dpTR56dWuhgxGgRArUdAJ4kyEmppMkvizNKtceYnpYnhbZ0TQCgvn1t
S+doC2ttD99M4Tc6h7gZkqo=
=J0XG
-----END PGP SIGNATURE-----
Re: (Bash) borrando directorios vacios recursivamente
#1824
Author: Alberto Cabello Sanchez
Date: Fri, 29 Jul 2005 09:23
17 lines
1908 bytes
Iv�n S�nchez Ortega wrote:
> Creo que la soluci�n pasa por ordenar los resultados del find, de tal manera
> que el rmdir borre primero los hijos y despu�s los padres... Un sort -r
> (--reverse) hace el truco...
> 
> find -type d | sort -r
> 
> Ahora hay que pasarle esas l�neas, una a una, como par�metro a un rmdir
> - --ignore-fail-on-non-empty ... Pero como mis dotes de programaci�n en bash
> son pr�cticamente nulas estoy pr�cticamente seguro de que esto *no*
> funciona:
> 
> for i in `find -type d | sort -r` do rmdir $i; done;
> 

Siento contradecirte, pero que eso s� funciona si pones en �ltimo punto 
y coma justo antes del "do".
Re: (Bash) borrando directorios vacios recursivamente
#1825
Author: Carlos
Date: Fri, 29 Jul 2005 13:52
32 lines
2027 bytes
Javier M Mora (jamarier) wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> haciendo un scriptcillo en bash, me encuentro con un arbol de
> directorios que puede tener directorios vacios.
> 
> Quiero borrar dichos directorios vacios y si al borrar un directorio su
> directorio queda igualmente vacio este tambien ha de borrarse, y as�
> hasta que todos los directorios que queden est�n con al menos un
> fichero/directorio.
> 
> tengo varios elementos en la mano, pero no se muy bien como conjugarlos:
> 
> rmdir s�lo borra si est� vac�o, as� que como primera aproximaci�n se me
> ocurri�:
> 
> find -type d -exec rmdir '{}' ';'
> 
> a parte de generar muchos errores (que se pueden eliminar usando la
> opci�n: --ignore-fail-on-non-empty) no hace el proceso recursivo. De
> hecho, find encuentra los ficheros de padres a hijos y no al contrario
> que ser�a lo ideal. 

Me acabo de fijar en man find, y adem�s de -depth (procesar primero los 
hijos), est� -empty (�!). As� que...

  find . -type d -depth -empty -exec rmdir '{}' ';'

...te deber�a servir. Hay que leer el manual :)).

-- 
Re: (Bash) borrando directorios vacios recursivamente
#1828
Author: Javier M Mora (jamarier)
Date: Fri, 29 Jul 2005 19:11
52 lines
2812 bytes
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Carlos escribi�:
> Javier M Mora (jamarier) wrote:
>> -----BEGIN PGP SIGNED MESSAGE-----
>> 
>> find -type d -exec rmdir '{}' ';'
>> 
>> a parte de generar muchos errores (que se pueden eliminar usando la
>> opci�n: --ignore-fail-on-non-empty) no hace el proceso recursivo. De
>> hecho, find encuentra los ficheros de padres a hijos y no al contrario
>> que ser�a lo ideal. 
>
> Me acabo de fijar en man find, y adem�s de -depth (procesar primero los 
> hijos), est� -empty (�!). As� que...
>
>   find . -type d -depth -empty -exec rmdir '{}' ';'
>
> ...te deber�a servir. Hay que leer el manual :)).

Oh, gran maestro entre maestros, yo te saludo. Reconozco que soy de los
que he dicho muchas veces que find tiene muchas opciones interesantes,
pero despu�s de leerme el manual de bash para aprender a programarlo, lo
intent� con el de find y se ve que ley opci�n si, opci�n no y esas me
las salt�.

De todas formas, cada me parece que programar en bash es un castigo que
no me he merecido. (el �ltimo problema lo tengo con nombres de ficheros
con espacios). Voy a pasar de sufrimientos y voy a usar el perl m�s
guarro que he visto en mi vida:     ;-)

`cps $uno $destino`
`finds -name asdfo asdf > fulu `
foreach $i (@ficheros) { `cps $i $destino`}

etc, etc, etc.

Seguiremos informando.
atte. javier m mora

- -- 
	Javier Maria Mora Merchan
	(GPGP) Key ID: 0x794F3D83

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)

iD8DBQFC6n+epRHCj3lPPYMRAmGrAJ9zU2aJMKwayw6M3YO2NudZg9dBhACfdXW4
stNnVT/vMo1pVkEdia+9vVM=
=xJQC
-----END PGP SIGNATURE-----
Re: (Bash) borrando directorios vacios recursivamente
#1829
Author: Iván Sánchez Ortega
Date: Fri, 29 Jul 2005 19:58
37 lines
2583 bytes
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Alberto Cabello Sanchez dixit:

>> for i in `find -type d | sort -r` do rmdir $i; done;
> 
> Siento contradecirte, pero que eso s� funciona si pones en �ltimo punto
> y coma justo antes del "do".

Vale, de acuerdo, no bash no es tan pobre como pensaba en un principio :-)

Sin embargo, el usar algo del estilo de (usando "echo" en vez de "rmdir"):
for i in `find -type d | sort -r`; do echo $i; done;

Tiene el problema de que Bash rompe el resultado del backtick no en los
saltos de l�nea, sino en los saltos de l�nea y espacios en blanco. Con lo
cual, esto falla horriblemente para directorios con espacios en su nombre.
Y yo tengo muchos de esos.

Un saludo,
- -- 
- ----------------------------------
Iv�n S�nchez Ortega -ivansanchez-arroba-escomposlinux-punto-org

http://acm.asoc.fi.upm.es/~mr/ 
Proudly running Debian Linux with 2.6.11-1-k7 kernel, KDE3.4.0, and PHP
5.0.4-0.10 generating this signature.
Uptime: 21:55:44 up 7 days, 13:02,  2 users,  load average: 2.10, 1.97, 1.83

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)

iD8DBQFC6opcR56dWuhgxGgRApRdAKChZSDfhlbQ898kCUnZINqWs82plACgokAd
2WjgSmX/rmqXbK42+HgckVM=
=WXk/
-----END PGP SIGNATURE-----
Re: (Bash) borrando directorios vacios recursivamente
#1830
Author: David Serrano (Hue-Bond)
Date: Fri, 29 Jul 2005 23:30
36 lines
2060 bytes
Javier M Mora (jamarier), vie20050729@21:11:58(CEST):
>
> De todas formas, cada me parece que programar en bash es un castigo que
> no me he merecido.

Pues es todo un arte :^).


> (el último problema lo tengo con nombres de ficheros con espacios).

Esto es típico. Basta con entrecomillar un par de cosas en su sitio y
listos. Lo haces un par de veces y le pillas el truco.

mkdir -p tmp/a
cd !$
touch a\ b c\ d
for I in *; do ls -l "$I"; done  ## comillas
cd ../..
rm -rf tmp/a  ## y dejamos el tmp/, que es buena costumbre


> Voy a pasar de sufrimientos y voy a usar el perl más
> guarro que he visto en mi vida:     ;-)
>
> `cps $uno $destino`

$(banner SACRILEGIO\!\!\!)


> `finds -name asdfo asdf > fulu `

ARGH! Y a mí que me dolía en la vista leer "targeta"...


-- 
 David Serrano
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads