web-dev-qa-db-fra.com

Existe-t-il un moyen plus rapide de supprimer un répertoire que "rm -rf"?

J'ai un dossier qui a beaucoup de fichiers et "rm -rf" prend beaucoup de temps pour terminer. Existe-t-il un moyen plus rapide de supprimer un répertoire et son contenu (sous-répertoires, etc.)?

29
Mohammad Moghimi

Vous pouvez essayer de dissocier l'inode du répertoire, mais cela vous laisserait toute une charge de fichiers orphelins sur laquelle fsck sera disparaître.

rm est aussi bon que possible.


Quelques personnes mentionnent les cas Edge où certaines choses sont plus rapides que d’autres. Mais assurons-nous de comparer les meilleures versions des mêmes choses.

Si vous souhaitez supprimer un répertoire et tout ce qu'il contient, je vous suggère:

rm -rf path/to/directory

rm va en interne lister les fichiers et les répertoires qu'il va supprimer. Et tout cela est compilé C. Ce sont ces deux raisons pour lesquelles c'est le plus rapide.

Ce n'est vraiment pas la même chose que rm -rf path/to/directory/* qui va développer au niveau de Shell et passer un chargement d'arguments dans rm. Ensuite, rm doit analyser ceux-ci puis récidiver de chacun. C'est beaucoup plus lent.

Tout comme un "point de repère" qui compare find path/to/directory -exec {} \; est un non-sens. rm est exécuté une fois par fichier trouvé. Tellement lent. La commande Find peut utiliser des arguments de commandes de construction de style xargs avec -exec rm {} +, mais cette opération est aussi lente que l'expansion. Vous pouvez appeler -delete qui utilise un appel interne unlink au noyau (comme le fait rm), mais cela ne fonctionnera que pour les fichiers au début.

Donc, pour répéter, à moins de jeter le disque dans du magma chaud, rm est roi.


Sur une note connexe, différents systèmes de fichiers suppriment des choses à des vitesses différentes en raison de leur structure. Si vous faites cela régulièrement, vous voudrez peut-être stocker ces fichiers dans une partition formatée en XFS, ce qui tend à gérer les suppressions assez rapidement.

Ou utilisez un disque plus rapide. Si vous avez des tonnes de RAM, utiliser /dev/shm (un disque RAM) pourrait être une idée.

31
Oli

Parfois, find $DIR_TO_DELETE -type f -delete est plus rapide que rm -rf.

Vous voudrez peut-être aussi essayer mkdir /tmp/empty && rsync -r --delete /tmp/empty/ $DIR_TO_DELETE.

Enfin, si vous devez supprimer le contenu de toute une partition, le plus rapide sera probablement umount, mkfs et re mount.

10
mivk

Si vous n'avez pas besoin d'espace libre, le moyen le plus rapide est de retarder la suppression et de le faire en arrière-plan:

  • mkdir .delete_me
  • mv big-directory-that-i-want-gone-.delete_me

Ensuite, ayez une crontab qui le fait à l’arrière-plan, à un moment silencieux, avec une faible probabilité d’E/S:

3 3 * * * root ionice -c 3 Nice find /path/to/.delete_me -maxdepth 1 ! -name \. -exec echo rm -rf "{}" +

Remarques:

  • vérifiez votre sortie avant de supprimer l'écho dans la crontab!
  • le répertoire .delete_me doit se trouver dans le même système de fichiers, au cas où cela ne serait pas évident pour tout le monde.

Mise à jour: j'ai trouvé un truc intéressant pour exécuter plusieurs machines en parallèle - cela vous aidera si vous avez une grande matrice de disques:

ionice -c 3 Nice find target_directory -depth -maxdepth 3 | xargs -d \n -P 5 -n 5 rm -rf
  • -depth pour faire une traversée en profondeur d'abord.

  • -maxdepth pour limiter la profondeur de la traversée de répertoires afin d'éviter d'écouter des fichiers individuels.

  • -d\n pour gérer les espaces dans les noms de fichiers.

  • -P et -n gèrent le degré de parallélisme (consultez la page de manuel).

ref: http://blog.liw.fi/posts/rm-is-too-slow/#comment-3e028c69183a348ee748d904a7474019

Mise à jour 2 (2018): Avec ZFS livré avec Ubuntu 18.04, je l'utilise pour tout et je créerai un nouveau . ensemble de données pour tout grand projet. Si vous planifiez à l’avance et le faites au préalable, vous pouvez simplement "détruire" un système de fichiers lorsque vous avez terminé. ;-)

J'ai utilisé les instructions du wiki zfsonlinux pour installer Ubuntu sur ZFS de manière native: https://github.com/zfsonlinux/zfs/wiki/Ubuntu-18.04-Root-on-ZFS

6
Lester Cheung

Je pense que le problème est qu’il n’existe pas de moyen idéal pour supprimer un répertoire très volumineux et son ensemble complet de contenus sans véritable système de classement indexé qui comprend la suppression de la liaison et ne signifie pas qu’il pense avoir des fichiers manquants dans FSCK. Il doit y avoir une confiance.

Par exemple, j'ai zoneminder en cours d'exécution pour un parcours de golf. J'ai construit un raid Linux de 1,5 TB pour gérer l'immense quantité de données capturées au cours d'une journée (12 flux vidéo). En résumé, le dossier de toutes les données capturées représente environ 1,4 TB de son stockage. Beaucoup à purger

Devoir réinstaller ZM et purger l'ancienne bibliothèque 1.4 TB n'est pas amusant, car il peut prendre 1 à 2 jours pour supprimer les anciennes images.

Un vrai FS indexé permet de supprimer un répertoire et sait que les données qu'il contient sont mortes et que la mise à zéro des données est une perte de temps et de ressources informatiques. Il devrait être une option pour mettre à zéro les données supprimées. RM prend juste trop longtemps dans le monde réel sur ext4.

Réponse: La dissociation récursive de tous les fichiers serait plus rapide de manière marginale, mais vous devrez tout de même prendre un temps supplémentaire pour exécuter FSCK.

Créez un script exécutant une commande "FOR" récursive qui peut "dissocier" tous les fichiers de vos dossiers, puis simplement rm ou rmdir tous les dossiers pour le nettoyer. Exécutez manuellement FSCK pour mettre à zéro le reste des données lorsque cela vous convient. Un peu paresseux ne l'ai pas écrit désolé :).

2
Adam Lazo

Bien que cela ne soit pas utile si vous voulez purger un répertoire existant, je mentionnerai qu'une stratégie possible si vous savez que vous aurez un répertoire avec un nombre de fichiers que vous devrez purger régulièrement consiste à placer le répertoire sur son propre système de fichiers ( par exemple , partition). Ensuite, lorsque vous devez le purger, le démonter, exécuter un mkfset le remonter. Par exemple OpenBSD conseille de faire cela pour /usr/obj , où de nombreux fichiers sont créés lors de la construction du système et doivent être supprimés avant la prochaine.

0
fkraiem