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
FMaz008
la source
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
quanta
la source
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
dtoubelis
la source
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 {} \;
George Tasioulis
la source
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 "{}" +
user9517
la source
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.

Waltur Buerk
la source