Existe-t-il une commande permettant de supprimer tous les fichiers et sous-répertoires d'un répertoire SANS supprimer le répertoire?
Par exemple, si j'ai le répertoire "dontDeleteMe" avec les sous-répertoires "1", "2", "3" et que chaque sous-répertoire contient quelques images, comment puis-je supprimer les sous-répertoires "1", "2" et "3" et tous les fichiers qu'ils contiennent, sans supprimer le répertoire parent "dontDeleteMe"?
la source
find dontDeleteMe/* -print0 | xargs -0 rm -rv
Je pense que dans la plupart des cas, cela fonctionnera, quels que soient les espaces et autres. Mais allez dans/tmp/
un répertoire de test et essayez-le. :)rm -rf dontDeleteMe && mkdir dontDeleteMe
ne garantit pas que le répertoire est recréé avec les mêmes autorisations / propriétaires. Utilisez plutôt l'une desfind dontDeleteMe/ -mindepth 1 -delete
variantes ci-dessous.La seule raison pour laquelle
rm -r ./*
vous ne travaillez pas toujours, c'est parce que vous pouvez avoir des fichiers cachés et / ou des dossiers sans correspondance*
.A cette fin,
bash
fournissez une option pour faire*
correspondre tout, même les objets cachés:Il peut être utile de rétablir
dotglob
son état par défaut (non défini) si vous continuez à utiliser le shell où vous avez exécuté les commandes ci-dessus:la source
Terminal ouvert ( Ctrl+ Alt+ T) et tapez ceci:
Cela correspondra à tous les fichiers et répertoires au sein de
somedir
ses (grands) enfants, y compris les fichiers de points "cachés" mais s’excluant eux-somedir
mêmes pour-mindepth 1
, ensuite-delete
.la source
Utilisez l'
xdev
option pour supprimer les fichiers uniquement dans les limites du périphérique.la source
-delete
. Cela implique-depth
et est plus facile à retenir que-depth -exec rm -Rf {} \;
Pour supprimer (dans le terminal) tous les fichiers et sous-répertoires à l'exception du répertoire de base nommé "dontdelete":
la source
Vous pouvez utiliser
find
avec le-delete
drapeau:find dontDeleteMe/* -delete
Le
/*
est important car il estfind
recommandé de rechercher uniquement DANS le dossier appelé "dontDeleteMe".Assurez-vous également que le
-delete
drapeau est à la fin de lafind
commande.la source
dotglob
. Sinon, l’-mindepth 1
option drapeau semble être le seul moyen de le faire fonctionner.Ce qui dit:
Supprimer tous les fichiers en commençant par. dans "répertoire" et tous les autres fichiers aussi.
Bien que, comme l'a gentiment noté Neftas, cette solution n'est pas sans danger!
La solution plus sûre est:
la source
.
et..
. Cela peut être évité en passant{.*}
à{.??*}
, mais vous ne supprimerez pas les fichiers cachés comportant un seul caractère, tel que.a
.Je ne sais pas pourquoi c'est si complexe, aidez-moi si je me trompe
C'est ça
la source
Il y a une réponse encore plus simple:
cd dontDeleteMe
rm -rf *
Cours de base sur l’administration du système: veillez à savoir où vous en êtes lorsque vous utilisez des commandes rapides comme celle-ci.
Je ne peux pas dire ça assez. J'ai dû récupérer une boîte parce que quelqu'un ne faisait pas attention et a tapé
rm -rf *
dans /.* nix suppose que si vous êtes root ou si vous êtes soudainement root, vous savez ce que vous faites. Assurez-vous donc de savoir ce que vous faites avant de le faire.
Une autre solution permettant de s’assurer que votre commande "cd" fonctionne avant de lancer le "rm" consiste à utiliser
la source
cd dontDeleteMe && rm -rf *
&&
opérateur ne se contente pas de chaîner les commandes; il faut que chaque commande réussisse avant que la suivante ne soit exécutée. Si lacd
commande échoue pour une raison quelconque (le répertoire n'existe pas, les privilèges, etc.), larm
commande ne sera pas exécutée. J'appellerais ça plus sûr.la source
rm -rf *
quand même.effacera le répertoire de travail actuel
la source