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

76

J'essaie de supprimer tous les fichiers et sous-répertoires d'un répertoire. J'avais l'habitude rm -rde supprimer tous les fichiers, mais je souhaite supprimer tous les fichiers et sous - répertoires, à l'exclusion du répertoire principal lui-même.

Par exemple, j'ai un répertoire supérieur comme images. Il contient les fichiers header.png, footer.pnget un sous - répertoire.

Maintenant , je veux supprimer header.png, footer.pnget le sous - répertoire, mais pas images.

Comment puis-je faire cela sous Linux?

pauvre
la source
1
Cd dans le répertoire et faire un rm -Rfde tous les fichiers et répertoires qu'il contient.
Noufal Ibrahim

Réponses:

59

Si votre répertoire de niveau supérieur est appelé images, exécutez-le rm -r images/*. Ceci utilise l'opérateur glob shell *pour s'exécuter rm -rsur tous les fichiers ou répertoires qu'il contient images.


la source
30
Le fichier caché ne sera pas supprimé.
Reto
51

Pour supprimer les fichiers cachés, vous devez spécifier:

rm -r images/* images/.*

Avec les shells dont les globs incluent .et .., cela entraînera une erreur comme

rm: cannot remove `.' directory `images/.'
rm: cannot remove `..' directory `images/..'

mais cela supprimera les fichiers cachés.

Une approche sans message d'erreur consiste à utiliser rechercher / supprimer avec mindepth. C'est gnu-find.

find images -mindepth 1 -delete

Votre recherche peut manquer du prédicat -mindepthou -delete, dans ce cas, vous pouvez faire:

find images/. ! -name . -prune -exec rm -rf {} +
Utilisateur inconnu
la source
Ma suggestion était d'utiliser "rm -r images /.*" qui correspondrait à "images / .." mais pas "images /../ ..". La récursivité ne peut pas monter, car «images /../ images / ..» est à nouveau le même répertoire.
Utilisateur inconnu
4
@DarkHeart rm .*ne supprime pas .ou ..et n'a pas supprimé depuis au moins 1994 pour les utilitaires GNU et probablement depuis la fin des années 70 pour UNIX . Il est extrêmement improbable que vous trouviez un système qui rm .*parcourt le système de fichiers vers le haut en dehors d'un musée.
terdon
21

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

  • utiliser ls -Abpour faire correspondre tous les fichiers / répertoires

    cd dir_name && rm -rf `ls -Ab`
    
  • utiliser findpour faire correspondre tous les fichiers / répertoires

    find dir_name -mindepth 1 -delete
    

    ou, si vous findne supportez pas -delete:

    find dir_name -mindepth 1 -exec rm -rf {}
    
  • supprimer le dossier, puis le recréer

    rm -rf dir_name && mkdir dir_name
    
  • en bash,

    shopt -s dotglob  
    rm -rf dir_name/*
    
zeekvfu
la source
Notez que la commande like rm -rf *n'est pas sûre si vous ne connaissez pas les fichiers d'un répertoire, car un fichier commençant par -(un trait d'union) sera interprété comme un rmindicateur ...
VasyaNovikov
1
EDIT: pour le faire en toute sécurité, utilisezrm -rf ./* ./.*
VasyaNovikov
9

Pour supprimer tous les fichiers normaux de manière récursive dans un répertoire, cette commande (en supposant que GNU ou FreeBSD find) est suffisante:

find . -type f -delete

Cela laisse tous les fichiers non normaux tels que les liens symboliques (qu'ils désignent des fichiers normaux ou non), des répertoires, des fifos, des sockets, des périphériques, etc.

Voir également:

find . ! -type d -delete

pour supprimer des fichiers de tout type sauf le répertoire .

Amit Singh
la source
6

Essayez cette version:

 rm -r test/*
démas
la source
1
Cela ne supprimera pas les fichiers cachés (ceux commençant par ".").
gbmhunter
3

J'utilise la findcommande ici:

Étape 1: Trouvez tous les fichiers et supprimez-les:

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

Exemple:

find /home/user/Desktop/images/ -type f -exec rm {} \;

Étape 2: Trouvez tous les sous-répertoires et supprimez-les:

find /path/to/directory/ -type d -exec rm -R {} \;
Mandar Shinde
la source
find /path/to/directory/ -type dcomprend .donc supprimera le répertoire lui-même. Vous devez également utiliser le -mindepthcommutateur comme d'autres l'ont dit.
Arthur Tacca le
3

La question était de vider un répertoire = supprimer le contenu d'un répertoire comprenant des fichiers cachés, mais pas le répertoire lui-même. La commande find avec -mindepth 1 est en fait la meilleure façon de procéder, mais pour éviter les messages d'erreur, elle doit être associée à -maxdepth 1:

find /path/to/dir -mindepth 1 -maxdepth 1 -exec rm -rf '{}' \;
Maddes
la source
0

La syntaxe de rm est la suivante:

rm [OPTION]... FILE...

Donc, vous devez indiquer explicitement le chemin approprié, par exemple

rm -r sub_dir/
Zaur Nasibov
la source
0

Vous pouvez supprimer le répertoire en utilisant la commande suivante:

sudo rm -r directoryname1/2/3/*

Il sera supprimer tout le répertoire après 3 / *.

Exemple sudo rm -r Téléchargements / chanson / *

Il sera supprimer tous les fichiers qui sont à l'intérieur Downloads/song.

Dharmendra Rajput
la source
0

Cela fonctionne parfaitement pour moi, testé plusieurs variantes travaillées à chaque fois.

À partir du répertoire qui contient le répertoire images.

rm -frd ./images/*

avant:

images/
    |_ header.png
    |_ footer.png
    |_ subdir/

après:

images/
deb-linux-user
la source
Je ne suis pas sûr que cela ait été précisé dans la question initiale, mais je voudrais juste souligner que, sauf si vous activez dotglob, cela ignorera tout fichier "point" ou répertoire de points sous images ( mkdir images/.somedir; touch images/.somefile)
Jeff Schaller
0

Pour supprimer tous les fichiers et sous-répertoires du répertoire actuel, y compris ceux cachés, sans message d'erreur :

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

Ou, à partir du répertoire parent:

rm -rf images/.[^.] images/.??* images/*

De https://serverfault.com/a/47940/269538 .

cette
la source
-2

Supprimez le dossier "test" et tous les fichiers qu'il contient:

 rm -r test

Supprimez tous les fichiers à l'intérieur mais conservez le dossier "test":

 rm -r test/*
Mike22LFC
la source
-4

cd dans le dossier puis exécutez la commande suivante:

ls |xargs rm -rf
Sean
la source
2
Cela échouera dans les noms de fichiers contenant des espaces. Je déconseille d'utiliser la sortie de ls en tant qu'entrée pour d'autres commandes, elle est généralement dangereuse.
Dhag