|
|
|
|
||||||
| fr.comp.os.unix Système UNIX. |
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
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 ne vois qu'une solution : % (cd $D && find . ! -name . -prune -exec rm -fr -- {} +) Fonctionne-t-elle dans tous les cas ? En existe-t-il d'autres ? Merci. -- Benoit Izac |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
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 ne vois qu'une solution : > % (cd $D && find . ! -name . -prune -exec rm -fr -- {} +) 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 ? |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
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. >> >> Je ne vois qu'une solution : >> % (cd $D && find . ! -name . -prune -exec rm -fr -- {} +) > > 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 |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
* ALain Montfranc [2007.03.10 16:25]:
> Benoit Izac a écrit >> Je ne souhaite utiliser que des commandes POSIX. >> >> Je ne vois qu'une solution : >> % (cd $D && find . ! -name . -prune -exec rm -fr -- {} +) > > 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) find -print0 n'est pas posix, pas plus que xargs -0 Ce sont des extensions GNU. -- JR |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
Benoit Izac wrote in message <87bqj1ujgf@message.id>:
> - ç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. |
|
|
|
#6 |
|
Messages: n/a
Hébergeur: |
Bonjour,
le 10/03/2007 à 18:07, Nicolas George a écrit dans le message <45f2e5e8$0$3217$426a74cc@news.free.fr> : >> - ç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 |
|
|
|
#7 |
|
Messages: n/a
Hébergeur: |
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 ne vois qu'une solution : > % (cd $D && find . ! -name . -prune -exec rm -fr -- {} +) > > Fonctionne-t-elle dans tous les cas ? [...] (unset CDPATH cd -P -- "$D" && find . ! -name . -prune -exec rm -fr {} +) ou 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 |
|
|
|
#8 |
|
Messages: n/a
Hébergeur: |
Bonjour,
le 10/03/2007 à 19:09, Stephane Chazelas a écrit dans le message <slrnev5t4e.coh.stephane.chazelas@spam.is.invali d> : >> 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 |
|
![]() |
| Outils de la discussion | |
|
|