Comment supprimer tout dans un répertoire?

25

Comment supprimer tout dans un répertoire, y compris les fichiers et répertoires cachés?

En ce moment, j'utilise ce qui suit:

rm -rf *
rm -rf .*
David Smith
la source
5
Vous pouvez les combiner avec rm -rf .* *.
utilisateur inconnu
2
Vous pouvez monter un répertoire puis exécuterrm -rf yourdirectory/*
shreyansp
1
désolé manqué la partie du répertoire caché. La solution des utilisateurs précédents couvre cela
shreyansp
Cette deuxième option que vous avez publiée est très dangereuse. Il correspondra au ..répertoire, ce qui supprimera tout ce qui se trouve dans le répertoire ci-dessus .
Richard Peterson

Réponses:

17

Simple et direct:

find -delete 

Comprend des répertoires et des fichiers cachés. Au moins, gnu-find le sait -delete, votre findpeut différer.

Utilisateur inconnu
la source
1
Pour éviter de supprimer le répertoire, utilisez find /path -delete -mindepth 1.
orodbhen
@orodbhen: find -delete ne supprimera pas le répertoire où vous lancez la commande (comme dans la question avec rm).
utilisateur inconnu
11

La meilleure réponse est: ne faites pas ça. Supprimez récursivement le répertoire lui-même, puis recréez-le en tant que répertoire vide. Il est plus fiable et plus facile pour les autres de comprendre ce que vous essayez de faire. Lorsque vous recréez le répertoire, il peut avoir un propriétaire, un groupe et des autorisations différents. Si ceux-ci sont importants, faites attention. De plus, si des programmes en cours d'exécution ont des descripteurs de fichiers ouverts (descripteurs) sur le répertoire, vous ne voudrez pas le supprimer. Si aucun de ces cas particuliers ne s'applique, il est plus simple de supprimer l'intégralité du répertoire.

Chris Quenelle
la source
7
Alors, comment est-ce plus facile? «Soyez prudent» n'est pas une réponse. Je ne comprendrais pas pourquoi quelqu'un supprime un répertoire et le reconstruit à nouveau.
utilisateur inconnu
J'ai ajouté l'expression "comme un répertoire vide", c'est peut-être plus clair.
Chris Quenelle
2
Non, cela n'explique pas pourquoi vous supprimez un répertoire et le recréez ensuite. Aux choses à considérer appartient, entre autres, la date / heure de création aussi.
utilisateur inconnu
2
Si ce répertoire est le répertoire de travail actuel d'un processus, vous pouvez rencontrer des problèmes. En outre, si vous supprimez le répertoire, vous supprimez des informations sur ses autorisations et sa propriété.
8
rm -rf -- * .[!.]* ..?*

Chacun des trois modèles se développe s'il ne correspond à rien, mais ce n'est pas un problème ici car nous voulons tout faire correspondre et rm -fignorer les arguments inexistants.

Notez que .*cela correspondrait.. .

Gilles 'SO- arrête d'être méchant'
la source
5

En supposant que bash 4+:

shopt -s dotglob
rm -rf -- *
##or:
rm -rf ./*

Avec dotglob activé, *s'étend à tous les fichiers et répertoires, même ceux commençant par .- mais ne s'étend pas à .et .., il est donc sûr de l'utiliser avec rm.

evilsoup
la source
2

si vous êtes dans le répertoire:

cd .. && rm -rf dir && mkdir dir && cd dir

autrement:

rm -rf /path/to/dir && mkdir /path/to/dir

David Harris
la source
2

Oh mon Zsh

rm -rf (.|)*

Encore une fois, c'est uniquement pour Zsh.

phunehehe
la source
2
Ou *(D)(le Dqualificatif glob active l' glob_dotsoption pour ce modèle).
Gilles 'SO- arrête d'être méchant'
Ou rm -rf {.,}*(contrairement à bash, zsh n'inclut pas .et ..dans {.,}*, au moins sur ma machine).
sasha
1

Que diriez-vous d'utiliser find. Je pense que c'est généralement un bon choix lorsque vous devez fouiller dans des sous-répertoires.

find . -type f -exec rm {} \;
slashdot
la source
1
il y a un commutateur -delete, donc vous pouvez supprimer des répertoires. (au moins dans gnu-find).
utilisateur inconnu
cela ne supprimera pas les sous
sasha
-2

Essayez rm -rf *?*. Cela supprimera les fichiers normaux et masqués.

Gladimdim
la source
4
Pas dans aucune coquille que je sache.
Gilles 'SO- arrête d'être méchant'
vous avez raison. il ne supprime pas les sous-répertoires.
gladimdim
4
Il est plus probable que le problème *?*ne correspondra pas aux fichiers / répertoires "dot" (sauf si vous avez activé l' dotgloboption dans bash , l' GLOB_DOTSoption dans zsh ou un équivalent pour le shell que vous utilisez).
Chris Johnsen