Je cherche à vider le répertoire $D de tout ce qu'il contient. Je
considère que le propriétaire de son contenu (pas forcément du
répertoire lui-même) est le même que celui qui lance la commande. Je ne
souhaite utiliser que des commandes POSIX.
Je cherche à vider le répertoire $D de tout ce qu'il contient. Je considère que le propriétaire de son contenu (pas forcément du répertoire lui-même) est le même que celui qui lance la commande. Je ne souhaite utiliser que des commandes POSIX.
le cd $D est inutile find $D ... marchera et tu peux remplacer le -exec par un xargs (avec l'option -0 bien sur et un print0 dans le find)
De plus quel interet de descendre dans le repertoire puisque tu fais un rm recursif ?
Rajoute donc un maxdepth dans le find...
Fonctionne-t-elle dans tous les cas ? En existe-t-il d'autres ?
Pourquoi pas un rm -rf $D && mkdir $D ?
Benoit Izac a écrit
Bonjour,
Je cherche à vider le répertoire $D de tout ce qu'il contient. Je
considère que le propriétaire de son contenu (pas forcément du
répertoire lui-même) est le même que celui qui lance la commande. Je ne
souhaite utiliser que des commandes POSIX.
Je cherche à vider le répertoire $D de tout ce qu'il contient. Je considère que le propriétaire de son contenu (pas forcément du répertoire lui-même) est le même que celui qui lance la commande. Je ne souhaite utiliser que des commandes POSIX.
le cd $D est inutile find $D ... marchera et tu peux remplacer le -exec par un xargs (avec l'option -0 bien sur et un print0 dans le find)
De plus quel interet de descendre dans le repertoire puisque tu fais un rm recursif ?
Rajoute donc un maxdepth dans le find...
Fonctionne-t-elle dans tous les cas ? En existe-t-il d'autres ?
Pourquoi pas un rm -rf $D && mkdir $D ?
Benoit Izac
Bonjour,
le 10/03/2007 à 17:25, ALain Montfranc a écrit dans le message :
Je cherche à vider le répertoire $D de tout ce qu'il contient. Je considère que le propriétaire de son contenu (pas forcément du répertoire lui-même) est le même que celui qui lance la commande. Je ne souhaite utiliser que des commandes POSIX.
le cd $D est inutile find $D ... marchera et tu peux remplacer
Non car mon « ! -name . » ne fonctionnera plus.
le -exec par un xargs (avec l'option -0 bien sur et un print0 dans le find)
-print0 n'est pas POSIX. xargs -0 non plus.
De plus quel interet de descendre dans le repertoire puisque tu fais un rm recursif ?
Je ne descends pas dedans puisque j'utilise « -prune ».
Rajoute donc un maxdepth dans le find...
-maxdepth n'est pas POSIX.
Fonctionne-t-elle dans tous les cas ? En existe-t-il d'autres ?
Pourquoi pas un rm -rf $D && mkdir $D ?
Pour au moins deux raisons : - cela risque de changer les permissions qu'avait initialement $D ; - ça ne fonctionnera pas si tu n'es pas propriétaire de $D (cas de $D avec le sticky bit).
-- Benoit Izac
Bonjour,
le 10/03/2007 à 17:25, ALain Montfranc a écrit dans le message
<mn.54157d73a7dc0ea6.51095@x.con> :
Je cherche à vider le répertoire $D de tout ce qu'il contient. Je
considère que le propriétaire de son contenu (pas forcément du
répertoire lui-même) est le même que celui qui lance la commande. Je ne
souhaite utiliser que des commandes POSIX.
le cd $D est inutile find $D ... marchera et tu peux remplacer
Non car mon « ! -name . » ne fonctionnera plus.
le -exec par un xargs (avec l'option -0 bien sur et un print0 dans le
find)
-print0 n'est pas POSIX. xargs -0 non plus.
De plus quel interet de descendre dans le repertoire puisque tu fais
un rm recursif ?
Je ne descends pas dedans puisque j'utilise « -prune ».
Rajoute donc un maxdepth dans le find...
-maxdepth n'est pas POSIX.
Fonctionne-t-elle dans tous les cas ?
En existe-t-il d'autres ?
Pourquoi pas un rm -rf $D && mkdir $D ?
Pour au moins deux raisons :
- cela risque de changer les permissions qu'avait initialement $D ;
- ça ne fonctionnera pas si tu n'es pas propriétaire de $D (cas de
$D avec le sticky bit).
le 10/03/2007 à 17:25, ALain Montfranc a écrit dans le message :
Je cherche à vider le répertoire $D de tout ce qu'il contient. Je considère que le propriétaire de son contenu (pas forcément du répertoire lui-même) est le même que celui qui lance la commande. Je ne souhaite utiliser que des commandes POSIX.
le cd $D est inutile find $D ... marchera et tu peux remplacer
Non car mon « ! -name . » ne fonctionnera plus.
le -exec par un xargs (avec l'option -0 bien sur et un print0 dans le find)
-print0 n'est pas POSIX. xargs -0 non plus.
De plus quel interet de descendre dans le repertoire puisque tu fais un rm recursif ?
Je ne descends pas dedans puisque j'utilise « -prune ».
Rajoute donc un maxdepth dans le find...
-maxdepth n'est pas POSIX.
Fonctionne-t-elle dans tous les cas ? En existe-t-il d'autres ?
Pourquoi pas un rm -rf $D && mkdir $D ?
Pour au moins deux raisons : - cela risque de changer les permissions qu'avait initialement $D ; - ça ne fonctionnera pas si tu n'es pas propriétaire de $D (cas de $D avec le sticky bit).
le 10/03/2007 à 18:07, Nicolas George a écrit dans le message <45f2e5e8$0$3217$ :
- ça ne fonctionnera pas si tu n'es pas propriétaire de $D (cas de $D avec le sticky bit).
Petite erreur ici : le sticky-bit joue s'il est sur le parent de $D, pas sur $D lui-même.
Le sticky bit joue sur ses descendants. J'ai parlé du sticky bit en pensant à « /tmp » mais en fait ça n'a rien à voir dans mon cas.
J'aurais du dire : - ça ne fonctionne pas si tu n'as pas la permission en écriture sur le parent de $D, rm va échoué.
-- Benoit Izac
Stephane Chazelas
2007-03-10, 17:09(+01), Benoit Izac:
Bonjour,
Je cherche à vider le répertoire $D de tout ce qu'il contient. Je considère que le propriétaire de son contenu (pas forcément du répertoire lui-même) est le même que celui qui lance la commande. Je ne souhaite utiliser que des commandes POSIX.
find "$D/." ! -name . -prune -exec rm -rf {} + (dans la mesure ou $D ne commence pas part "-")
Tu as aussi:
ln -s "$D" "$D.link" && rm -rf "$D.link/"
(dans la mesure ou "$D" est absolu).
qui est POSIX (je pense) mais ne marche pas avec GNU rm sous Linux (entre autres).
-- Stéphane
2007-03-10, 17:09(+01), Benoit Izac:
Bonjour,
Je cherche à vider le répertoire $D de tout ce qu'il contient. Je
considère que le propriétaire de son contenu (pas forcément du
répertoire lui-même) est le même que celui qui lance la commande. Je ne
souhaite utiliser que des commandes POSIX.
Je cherche à vider le répertoire $D de tout ce qu'il contient. Je considère que le propriétaire de son contenu (pas forcément du répertoire lui-même) est le même que celui qui lance la commande. Je ne souhaite utiliser que des commandes POSIX.
find "$D/." ! -name . -prune -exec rm -rf {} + (dans la mesure ou $D ne commence pas part "-")
Tu as aussi:
ln -s "$D" "$D.link" && rm -rf "$D.link/"
(dans la mesure ou "$D" est absolu).
qui est POSIX (je pense) mais ne marche pas avec GNU rm sous Linux (entre autres).
-- Stéphane
Benoit Izac
Bonjour,
le 10/03/2007 à 19:09, Stephane Chazelas a écrit dans le message :
Je cherche à vider le répertoire $D de tout ce qu'il contient. Je considère que le propriétaire de son contenu (pas forcément du répertoire lui-même) est le même que celui qui lance la commande. Je ne souhaite utiliser que des commandes POSIX. [...]
ln -s "$D" "$D.link" && rm -rf "$D.link/"
(dans la mesure ou "$D" est absolu).
qui est POSIX (je pense) mais ne marche pas avec GNU rm sous Linux (entre autres).
Tu es sûr ? Ça me parait plutôt dangereux comme commande. Un « / » en trop en voulant supprimer un lien symbolique et on perd le contenu du répertoire (et le lien).
Selon SUSv3 pour rm(1) (je ne suis pas sûr de bien comprendre la dernière phrase) :
| The rm utility removes symbolic links themselves, not the files they | refer to, as a consequence of the dependence on the unlink() | functionality, per the DESCRIPTION. When removing hierarchies with -r | or -R, the prohibition on following symbolic links has to be made | explicit.
Mais la description de unlink(2) me paraît claire :
| The unlink() function shall remove a link to a file. If path names | a symbolic link, unlink() shall remove the symbolic link named by path | and shall not affect any file or directory named by the contents of | the symbolic link.
-- Benoit Izac
Bonjour,
le 10/03/2007 à 19:09, Stephane Chazelas a écrit dans le message
<slrnev5t4e.coh.stephane.chazelas@spam.is.invalid> :
Je cherche à vider le répertoire $D de tout ce qu'il contient. Je
considère que le propriétaire de son contenu (pas forcément du
répertoire lui-même) est le même que celui qui lance la commande. Je
ne souhaite utiliser que des commandes POSIX.
[...]
ln -s "$D" "$D.link" &&
rm -rf "$D.link/"
(dans la mesure ou "$D" est absolu).
qui est POSIX (je pense) mais ne marche pas avec GNU rm sous
Linux (entre autres).
Tu es sûr ? Ça me parait plutôt dangereux comme commande. Un « / » en
trop en voulant supprimer un lien symbolique et on perd le contenu du
répertoire (et le lien).
Selon SUSv3 pour rm(1) (je ne suis pas sûr de bien comprendre la
dernière phrase) :
| The rm utility removes symbolic links themselves, not the files they
| refer to, as a consequence of the dependence on the unlink()
| functionality, per the DESCRIPTION. When removing hierarchies with -r
| or -R, the prohibition on following symbolic links has to be made
| explicit.
Mais la description de unlink(2) me paraît claire :
| The unlink() function shall remove a link to a file. If path names
| a symbolic link, unlink() shall remove the symbolic link named by path
| and shall not affect any file or directory named by the contents of
| the symbolic link.
le 10/03/2007 à 19:09, Stephane Chazelas a écrit dans le message :
Je cherche à vider le répertoire $D de tout ce qu'il contient. Je considère que le propriétaire de son contenu (pas forcément du répertoire lui-même) est le même que celui qui lance la commande. Je ne souhaite utiliser que des commandes POSIX. [...]
ln -s "$D" "$D.link" && rm -rf "$D.link/"
(dans la mesure ou "$D" est absolu).
qui est POSIX (je pense) mais ne marche pas avec GNU rm sous Linux (entre autres).
Tu es sûr ? Ça me parait plutôt dangereux comme commande. Un « / » en trop en voulant supprimer un lien symbolique et on perd le contenu du répertoire (et le lien).
Selon SUSv3 pour rm(1) (je ne suis pas sûr de bien comprendre la dernière phrase) :
| The rm utility removes symbolic links themselves, not the files they | refer to, as a consequence of the dependence on the unlink() | functionality, per the DESCRIPTION. When removing hierarchies with -r | or -R, the prohibition on following symbolic links has to be made | explicit.
Mais la description de unlink(2) me paraît claire :
| The unlink() function shall remove a link to a file. If path names | a symbolic link, unlink() shall remove the symbolic link named by path | and shall not affect any file or directory named by the contents of | the symbolic link.
-- Benoit Izac
Nicolas George
Benoit Izac wrote in message :
Tu es sûr ? Ça me parait plutôt dangereux comme commande. Un « / » en trop en voulant supprimer un lien symbolique et on perd le contenu du répertoire (et le lien).
C'est surtout le -r qui est en trop, dans ce cas.
Benoit Izac wrote in message <87ejnwbw1o@message.id>:
Tu es sûr ? Ça me parait plutôt dangereux comme commande. Un « / » en
trop en voulant supprimer un lien symbolique et on perd le contenu du
répertoire (et le lien).
Tu es sûr ? Ça me parait plutôt dangereux comme commande. Un « / » en trop en voulant supprimer un lien symbolique et on perd le contenu du répertoire (et le lien).
C'est surtout le -r qui est en trop, dans ce cas.
Stephane Chazelas
2007-03-10, 22:58(+01), Benoit Izac:
Bonjour,
le 10/03/2007 à 19:09, Stephane Chazelas a écrit dans le message :
Je cherche à vider le répertoire $D de tout ce qu'il contient. Je considère que le propriétaire de son contenu (pas forcément du répertoire lui-même) est le même que celui qui lance la commande. Je ne souhaite utiliser que des commandes POSIX. [...]
ln -s "$D" "$D.link" && rm -rf "$D.link/"
(dans la mesure ou "$D" est absolu).
qui est POSIX (je pense) mais ne marche pas avec GNU rm sous Linux (entre autres).
Tu es sûr ? Ça me parait plutôt dangereux comme commande. Un « / » en trop en voulant supprimer un lien symbolique et on perd le contenu du répertoire (et le lien).
Selon SUSv3 pour rm(1) (je ne suis pas sûr de bien comprendre la dernière phrase) :
| The rm utility removes symbolic links themselves, not the files they | refer to, as a consequence of the dependence on the unlink() | functionality, per the DESCRIPTION. When removing hierarchies with -r | or -R, the prohibition on following symbolic links has to be made | explicit.
Mais la description de unlink(2) me paraît claire :
| The unlink() function shall remove a link to a file. If path names | a symbolic link, unlink() shall remove the symbolic link named by path | and shall not affect any file or directory named by the contents of | the symbolic link.
Oui mais $D.link/ n'est pas un lien symbolique, c'est censé etre la meme chose que $D.link/. d'apres POSIX.
J'imagine que c'est plutot linux qui est a blamer ici. rm probablement fait la descente recursive si unlink renvoie un EISDIR.
-- Stéphane
2007-03-10, 22:58(+01), Benoit Izac:
Bonjour,
le 10/03/2007 à 19:09, Stephane Chazelas a écrit dans le message
<slrnev5t4e.coh.stephane.chazelas@spam.is.invalid> :
Je cherche à vider le répertoire $D de tout ce qu'il contient. Je
considère que le propriétaire de son contenu (pas forcément du
répertoire lui-même) est le même que celui qui lance la commande. Je
ne souhaite utiliser que des commandes POSIX.
[...]
ln -s "$D" "$D.link" &&
rm -rf "$D.link/"
(dans la mesure ou "$D" est absolu).
qui est POSIX (je pense) mais ne marche pas avec GNU rm sous
Linux (entre autres).
Tu es sûr ? Ça me parait plutôt dangereux comme commande. Un « / » en
trop en voulant supprimer un lien symbolique et on perd le contenu du
répertoire (et le lien).
Selon SUSv3 pour rm(1) (je ne suis pas sûr de bien comprendre la
dernière phrase) :
| The rm utility removes symbolic links themselves, not the files they
| refer to, as a consequence of the dependence on the unlink()
| functionality, per the DESCRIPTION. When removing hierarchies with -r
| or -R, the prohibition on following symbolic links has to be made
| explicit.
Mais la description de unlink(2) me paraît claire :
| The unlink() function shall remove a link to a file. If path names
| a symbolic link, unlink() shall remove the symbolic link named by path
| and shall not affect any file or directory named by the contents of
| the symbolic link.
Oui mais $D.link/ n'est pas un lien symbolique, c'est censé etre
la meme chose que $D.link/. d'apres POSIX.
le 10/03/2007 à 19:09, Stephane Chazelas a écrit dans le message :
Je cherche à vider le répertoire $D de tout ce qu'il contient. Je considère que le propriétaire de son contenu (pas forcément du répertoire lui-même) est le même que celui qui lance la commande. Je ne souhaite utiliser que des commandes POSIX. [...]
ln -s "$D" "$D.link" && rm -rf "$D.link/"
(dans la mesure ou "$D" est absolu).
qui est POSIX (je pense) mais ne marche pas avec GNU rm sous Linux (entre autres).
Tu es sûr ? Ça me parait plutôt dangereux comme commande. Un « / » en trop en voulant supprimer un lien symbolique et on perd le contenu du répertoire (et le lien).
Selon SUSv3 pour rm(1) (je ne suis pas sûr de bien comprendre la dernière phrase) :
| The rm utility removes symbolic links themselves, not the files they | refer to, as a consequence of the dependence on the unlink() | functionality, per the DESCRIPTION. When removing hierarchies with -r | or -R, the prohibition on following symbolic links has to be made | explicit.
Mais la description de unlink(2) me paraît claire :
| The unlink() function shall remove a link to a file. If path names | a symbolic link, unlink() shall remove the symbolic link named by path | and shall not affect any file or directory named by the contents of | the symbolic link.
Oui mais $D.link/ n'est pas un lien symbolique, c'est censé etre la meme chose que $D.link/. d'apres POSIX.
J'imagine que c'est plutot linux qui est a blamer ici. rm probablement fait la descente recursive si unlink renvoie un EISDIR.
-- Stéphane
Benoit Izac
Bonjour,
le 11/03/2007 à 15:14, Stephane Chazelas a écrit dans le message :
ln -s "$D" "$D.link" && rm -rf "$D.link/"
J'ai fait quelques tests avec ce que j'avais sous la main : - Linux : ne supprime rien - OpenBSD : supprime $D.link uniquement - FreeBSD : supprime $D et son contenu mais pas $D.link
Je vais garder ma solution à base de find. ;-)
-- Benoit Izac
Bonjour,
le 11/03/2007 à 15:14, Stephane Chazelas a écrit dans le message
<slrnev83n4.6ov.stephane.chazelas@spam.is.invalid> :
ln -s "$D" "$D.link" &&
rm -rf "$D.link/"
J'ai fait quelques tests avec ce que j'avais sous la main :
- Linux : ne supprime rien
- OpenBSD : supprime $D.link uniquement
- FreeBSD : supprime $D et son contenu mais pas $D.link
le 11/03/2007 à 15:14, Stephane Chazelas a écrit dans le message :
ln -s "$D" "$D.link" && rm -rf "$D.link/"
J'ai fait quelques tests avec ce que j'avais sous la main : - Linux : ne supprime rien - OpenBSD : supprime $D.link uniquement - FreeBSD : supprime $D et son contenu mais pas $D.link