OVH Cloud OVH Cloud

vider un répertoire

18 réponses
Avatar
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 ?
En existe-t-il d'autres ?

Merci.
--
Benoit Izac

8 réponses

1 2
Avatar
Yves Lambert
Benoit Izac wrote:

Je vais garder ma solution à base de find. ;-)


Pourquoi pas tout simplement :
origine=`pwd`
cd $D
rm -r *
cd $origine

Avatar
Benoit Izac
Bonjour,

le 11/03/2007 à 23:57, Yves Lambert a écrit dans le message
:

Je vais garder ma solution à base de find. ;-)


Pourquoi pas tout simplement :
origine=`pwd`
cd $D
rm -r *


rm -fr -- *

cd $origine


% cd un_endroit_de_test
% sh -c 'rm -fr -- *' # NE PAS FAIRE ÇA SANS RÉFLÉCHIR !
% ls -A
.hide
%

--
Benoit Izac


Avatar
Matthieu Moy
Yves Lambert writes:

Benoit Izac wrote:

Je vais garder ma solution à base de find. ;-)


Pourquoi pas tout simplement :
origine=`pwd`
cd $D
rm -r *


Que ce passe-t-il si $D n'existe pas ?





Dans ce genre de script, toujours faire

cd "$D" || exit 1

ou quelque chose du genre ...

--
Matthieu


Avatar
Matthieu Moy
Benoit Izac writes:

% cd un_endroit_de_test
% sh -c 'rm -fr -- *' # NE PAS FAIRE ÇA SANS RÉFLÉCHIR !
% ls -A
.hide
%


En principe, là, il y a quelqu'un pour essayer

rm -fr -- * .*

et en général, il passe quelques secondes plus tard dans la première
catégorie d'administrateurs systèmes (il y a ceux qui ont déjà fait
une connerie en étant root, et ceux qui vont pas tarder à la faire).

Je précise pour éviter aux lecteurs les moins attentifs de se faire
avoir que .* matche . et .. dans la plupart des shells ...


La solution correcte doit ressembler à ça :

rm -fr -- * .[^.]* ..?*

--
Matthieu

Avatar
ALain Montfranc
Yves Lambert a écrit
Benoit Izac wrote:

Je vais garder ma solution à base de find. ;-)


Pourquoi pas tout simplement :
origine=`pwd`
cd $D
rm -r *
cd $origine


Ca enlevera pas les rep/fichiers cachés

( cd $D && rm -rf -- * .[^.]* )

lancera un subshell et evite le origine / cd $ origine


Avatar
ALain Montfranc
(supersedes )

Yves Lambert a écrit
Benoit Izac wrote:

Je vais garder ma solution à base de find. ;-)


Pourquoi pas tout simplement :
origine=`pwd`
cd $D
rm -r *
cd $origine


Ca enlevera pas les rep/fichiers cachés

( cd $D && rm -rf -- * .[^.]* ..?* )

lancera un subshell et evite le origine / cd $ origine


Avatar
Benoit Izac
Bonjour,

le 12/03/2007 à 08:00, Matthieu Moy a écrit dans le message
:

% cd un_endroit_de_test
% sh -c 'rm -fr -- *' # NE PAS FAIRE ÇA SANS RÉFLÉCHIR !
% ls -A
.hide
%


En principe, là, il y a quelqu'un pour essayer

rm -fr -- * .*

et en général, il passe quelques secondes plus tard dans la première
catégorie d'administrateurs systèmes (il y a ceux qui ont déjà fait
une connerie en étant root, et ceux qui vont pas tarder à la faire).

Je précise pour éviter aux lecteurs les moins attentifs de se faire
avoir que .* matche . et .. dans la plupart des shells ...


Mais un rm POSIX ne doit rien faire avec « . » ou « .. » :

| If either of the files dot or dot-dot are specified as the basename
| portion of an operand (that is, the final pathname component), rm
| shall write a diagnostic message to standard error and do nothing more
| with such operands.

--
Benoit Izac


Avatar
Stephane Chazelas
2007-03-12, 08:01(+01), ALain Montfranc:
Yves Lambert a écrit
Benoit Izac wrote:

Je vais garder ma solution à base de find. ;-)


Pourquoi pas tout simplement :
origine=`pwd`
cd $D
rm -r *
cd $origine


Ca enlevera pas les rep/fichiers cachés

( cd $D && rm -rf -- * .[^.]* )
[...]


(
unset CDPATH
cd -P -- "$D" && exec rm -rf -- * .*
)

Mais on n'est pas a l'abri du E2BIG, d'ou le

(
unset CDPATH
cd -P -- "$D" &&
exec find . ! -name . -prune -exec rm -rf {} +
)

cd $D ne fait pas ce que tu crois qu'il fait

TOUJOURS QUOTER SES VARIABLES!!

--
Stéphane



1 2