Comment supprimer de nombreux (200 000) fichiers?


17

Je dois supprimer 200 000 fichiers (tous) d'un dossier et je ne veux pas supprimer le dossier lui-même.

en utilisant rm, j'obtiens une erreur "Liste d'arguments trop longue". J'ai essayé de faire quelque chose avec xargs, mais je ne suis pas un Shell Guy, donc ça ne marche pas:

find -name * | xargs rm -f

5
Pourquoi ne pas supprimer le dossier et le recréer après la suppression?
garconcn

Réponses:


35
$ find /path/to/folder -type f -delete

15
Il vaut probablement la peine de mentionner que GNU find (tel qu'utilisé par la plupart des distributions Linux) peut supprimer des fichiers par lui-même -delete. Cela évite également les problèmes avec les fichiers contenant des guillemets ou des caractères de nouvelle ligne (bien que vous puissiez utiliser -print0les -0options de GNU find et GNU xarg pour résoudre ce problème).
DerfK

3
@DerfK, belle remarque! En outre, beaucoup de ppl ont tendance à jouer avec xargsentre - temps finda la -exec command {} +syntaxe.
poige

5

Vous faites tout bien. C'est le '*' qui vous pose un problème (le shell le développe en liste de fichiers au lieu de find). La bonne syntaxe pourrait être:

cd <your_directory>; find . -type f | xargs rm -f
find <your_directory> -type f | xargs rm -f

(Ce dernier est un peu moins efficace car il passera des noms plus longs à xargs, mais vous remarquerez à peine :-))

Alternativement, vous pouvez échapper à votre '*' comme ceci (mais dans ce cas, il essaiera également de supprimer "." Et ".."; ce n'est pas un gros problème - vous obtiendrez juste un petit avertissement :-)):

find . -name '*' | xargs rm -f
find . -name "*" | xargs rm -f
find . -name \* | xargs rm -f

Si vos noms de fichiers contiennent des espaces, utilisez ceci:

find . -type f -print0 | xargs -0 rm -f

1
Cela ne fonctionne pas si vous avez un nom de fichier contenant un espace.
user9517

@lain: Oui, j'étais en train de modifier ma réponse pour inclure l'astuce pour les espaces blancs :-)
dtoubelis

3

La commande suivante supprimera tous les fichiers du répertoire actuel :

find . -type f -exec rm {} \;

2
-name '*'ne signifie pas "tous les fichiers". Les fichiers sont dit avec:-type f
poige

2

tu peux essayer

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

ou

find /path/to/folder -type f -exec rm -f "{}" +

1

Bravo à quantas réponse, voici quelques ajouts.

Si vous souhaitez supprimer des fichiers avec un modèle de nom particulier, vous pouvez l'écrire comme ceci. Également ajouté -print pour que vous puissiez voir ce qui se passe lorsque les fichiers sont supprimés.

sudo find /home/mydirectory -name "*.jpg" -type f -print -delete

Cela supprime par exemple tous les fichiers jpeg de mon répertoire.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.