Comment supprimer tous les fichiers d'un répertoire?

289

Le plus proche que j'ai eu est

# rm /path/to/directory/*.*

mais cela ne marche pas pour les fichiers sans extension ...

utilisateur784637
la source

Réponses:

340

Linux n'utilise pas d'extensions. Il appartient au créateur du fichier de décider s’il souhaite que le nom porte une extension. Linux examine le premier octet pour savoir quel type de fichier il traite.

Pour tout supprimer dans un répertoire, utilisez:

rm /path/to/directory/*

Vous pouvez utiliser l' -roption, par exemple:

rm -r /path/to/directory/*

pour supprimer également tous les sous-répertoires (ainsi que tout leur contenu) du répertoire dont vous supprimez le contenu. Sinon, une erreur s'affichera pour vous informer que le répertoire n'est pas supprimé.

Rinzwind
la source
13
Si vous souhaitez également supprimer les fichiers cachés, exécutez-les shopt -s dotglobavant de l'exécuterrm (...)
danjjl
7
Le * signifie all files;) *.*signifie tous les fichiers contenant .quelque part dans le nom
Rinzwind
10
@Rinzwind, plus précisément, l'astérisque signifie "zéro ou plus de n'importe quel caractère". Donc *a*signifie zéro ou plusieurs caractères, suivis de asuivis de zéro ou plus de caractères. Il égalerait les noms de fichiers happy, apple, aou la.
DisgruntledGoat
7
@ user784637 vous êtes trop facilement impressionné
barlop
1
Voici la commande que vous voulez: rm - *
anon58192932
168
  • Pour supprimer le dossier avec tout son contenu ( y compris tous les dossiers intérieurs ):

    rm -rf /path/to/directory
    
  • Pour supprimer tout le contenu du dossier ( y compris tous les dossiers intérieurs ) mais pas le dossier lui-même:

    rm -rf /path/to/directory/*
    

    ou

    rm -rf /path/to/directory/{*,.*}
    

    si vous voulez vous assurer que les fichiers / répertoires cachés sont également supprimés.

  • Pour supprimer tous les "fichiers" de l'intérieur d'un dossier ( sans supprimer les dossiers intérieurs ):

    rm -f /path/to/directory/{*,.*}
    


  • Attention : si vous avez des espaces dans votre chemin, veillez à toujours utiliser des guillemets.

    rm -rf /path/to the/directory/*
    

    équivaut à 2 rm -rfappels séparés :

    rm -rf /path/to
    rm -rf the/directory/*
    

    Pour éviter ce problème, vous pouvez utiliser 'des guillemets simples '( ne pas développer les variables shell) ou des "doubles guillemets "( développer les variables shell):

    rm -rf "/path/to the/directory/"*
    


Où:

  • rm- signifie " enlever "
  • -f- signifie " force ", ce qui est utile lorsque vous ne souhaitez pas être invité / demandé si vous souhaitez supprimer une archive, par exemple.
  • -r- signifie " récursif ", ce qui signifie que vous voulez consulter tous les dossiers de manière récursive et tout supprimer.
Lilian A. Moraru
la source
8
J'ai trouvé que c'était la réponse la plus complète et la plus utile, en plus de la réponse marquée comme Acceptée.
inspirednz
2
rm -rf /path/to/directory/*ne supprime pas un fichier caché dans le dossier, par exemple .htaccess. Peut rm -rf /path/to/directory/.- être ? Je n'ai pas essayé.
Mark Berry
@MarkBerry rm -rf /path/to/directory/.*
Lilian A. Moraru
@ LilianA.Moraru, j'ai fait quelques essais aujourd'hui. rm -rf /path/to/directory/.*ne supprime que les fichiers cachés du répertoire spécifié. En regardant le commentaire de @danjjl sur la réponse de @Rinzwind, pour supprimer également les fichiers cachés, exécutez-les shopt -s dotglobavant d'exécuter rm -rf /path/to/directory/*.
Mark Berry
ATTENTION: rm -rf /path/to/directory/.*sur mon système, la suppression d’éléments dans /path/to. Heureusement, je venais de sauvegarder toutes mes données sur un disque séparé. Inutile de dire que vous n'émettez PAS la commande à rm -rf /path/to/directory/.*moins que vous n'ayez sauvegardé l'intégralité de votre ordinateur dans un emplacement séparé / sécurisé!
lawlist
43

Pour supprimer tous les fichiers du répertoire (y compris les fichiers cachés et les sous-répertoires), exécutez:

rm -rf /path/to/directory/{*,.*}
Leonid V. Fedorenchik
la source
1
Cela devrait être la belle réponse acceptée. Je vous remercie!
Nam G VU
3
Ce glob ne correspond-il pas "." et aussi?
hertzsprung
4
@hertzsprung - si, et il vous avertira qu'il ne peut pas supprimer ./et ../, mais qu'il supprimera tout de même les fichiers cachés.
Ryan Wheale le
Cela ne fonctionne pas sur la console Mac, les fichiers cachés sont toujours là avec cette ligne de commande.
agapitocandemor
Pour tout supprimer du répertoire actuel:rm -r $(pwd)/{*,.*}
Jimmy Adaro
10

Si vous souhaitez supprimer uniquement les fichiers de / path / to / directory, vous pouvez le faire.

find /path/to/directory -type f -print0| xargs -0 rm 

ou

find /path/to/directory -type f -exec rm '{}' \;

Vous pouvez faire des charges avec find, l’avantage est que vous pouvez lister ce qui est trouvé sans le canaliser afin rmque vous puissiez voir ce qui sera supprimé avant de commencer.

Richard Holloway
la source
2
GNU finden tant que -deleteprédicat. Si vous voulez toujours utiliser -exec, substituer \;par +rassemblera les rmappels, ce qui augmentera l'efficacité.
enzotib
1
Une grande quantité de fichiers avec '+' posera problème, car la liste sera trop grande, comme pour rm -f *. et lors de la suppression de grandes quantités de fichiers du même dossier (parler en millons), les deux ne sont pas bons :) À la fin, C ++ est arrivé et a supprimé les fichiers dans l'ordre des inodes de dir-tree.
Osis
3
Vous devez vraiment ajouter un - après la chambre. Sans cela, si vous avez un nom de fichier, -rf ou similaire sera interprété comme un argument de rm. par exemple xargs -0 rm - ou -exec rm - {} \;
Richm
vous pouvez également fournir l'argument -n à xargs. Cela divisera les commandes rm en un nombre maximum d'arguments, c'est-à-dire que «xargs -n 100 -0 rm -» supprimera les fichiers par
tranches
1
Vous pouvez également ajouter -maxdepth 1 pour vous assurer que find ne renvoie pas de fichiers de sous-répertoires. c'est-à-dire find / path / to / directory -maxdepth 1 -type f
Richm
7

Pour supprimer tous les fichiers et répertoires (y compris ceux cachés ) d'un répertoire, vous pouvez essayer les solutions suivantes:

  • supprimer le dossier, puis le recréer

    rm -rf dir_name && mkdir dir_name
    
  • utilisation find

    find dir_name -mindepth 1 -delete  
    

Ici, nous -mindepth 1spécifions pour exclure le répertoire dir_name lui-même.
Jetez un coup d'oeil au lien suivant:
https://unix.stackexchange.com/questions/12593/how-to-remove-all-the-files-in-a-directory

zeekvfu
la source
Merci pour vos conseils et j'ai ajouté plus d'explications pour les liens.
mardi
3
Soyez prudent, car la suppression et la recréation du dossier peuvent entraîner des autorisations différentes / erronées pour ce dossier!
einjohn
6

Si vous souhaitez également supprimer tous les sous-répertoires et le répertoire lui-même, vous pouvez utiliser rm -rf /path/to/directory. Mais vérifiez toujours votre ligne avant d'appuyer sur Entrée, ce qui rm -rfpeut causer beaucoup de dégâts, par exemple si vous insérez accidentellement un espace après la première barre oblique tout en ayant les permissions de super-utilisateur ...

Tobias Kienzler
la source
1

Puisque cette question est constamment au sommet de Google lorsque je le recherche moi-même:

Les autres réponses souffrent de problèmes différents:

  1. Certains d'entre eux incluent .et ..qui est bruyant, déroutant et ennuyeux.

  2. Certains d'entre eux oublient les fichiers cachés (fichiers commençant par un point).

  3. Ils ne suppriment pas dans un ordre correct (le plus profond en premier) pour permettre la suppression du répertoire.

  4. Ils descendent dans d'autres systèmes de fichiers (montés), ce qui est souvent indésirable.

  5. Ils sont difficiles à étendre correctement avec des paramètres supplémentaires (plus de détails ci-dessous).

Donc, pour supprimer de manière récurrente tous les fichiers et dossiers d'un répertoire, procédez comme suit:

find "${DIR}" -xdev -mindepth 1 -printf "%d\t%y\t%p\0" | sort -z -r -n | cut -z -f3- | xargs -0 -r -- rm -d --

Notez que j'ai ajouté un -xdevargument pour empêcher la descente dans les montages (comme /procetc.).

Pourquoi pas -depthou -delete?

Bien que les gens me votent constamment pour cela, ces méthodes ont un inconvénient: elles ne semblent pas suffisamment extensibles pour autoriser -pruneun sous-répertoire (sans introduire plus de problèmes). En contraste avec cette méthode, vous pouvez insérer

-not \( -path "${DIR}/subdir" -prune \)

avant l' -mindepthargument à exclure subdirde la suppression de son contenu.

Mehrdad
la source
Et pour la première commande en profondeur, il y a un -depthdrapeau findpour cela.
Sergiy Kolodyazhnyy
Euh ... pourquoi ne pas simplement utiliser -deleteavecfind ? -deleteest la profondeur d'abord. Vous supposez déjà ne pas être POSIX findavec le -printf, alors vous pourriez aussi bien utiliser -deleteou-depth -print0 | xargs -0 rm
muru
@muru: Parce que je ne savais pas mieux ... je vais le changer.
Mehrdad
@muru: En fait, il semblerait que votre méthode ne fonctionne pas avec -not \( -path "$DIR/subdir" \)... mais la mienne fonctionne? Pourquoi?
Mehrdad,
@Mehrdad qu'est-ce que c'est censé faire?
muru
0

Vous pouvez cdentrer dans le répertoire et ensuite exécuter la commande rm *.*comme dans DOS si vous vous en souvenez.

VK Mavani
la source
1
DOS est SUPPR pour les fichiers et RMDIR pour les répertoires vides et les fichiers cachés et système doivent avoir ces attributs ATTRIB supprimés en premier. Pas aussi simple;)
Eric
0

Pour supprimer le répertoire actuel, vous pouvez par exemple utiliser rm -d ./*

-d demande également de supprimer les répertoires.

Arviman
la source