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.)?
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.
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
.
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:
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:
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
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é :).
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 mkfs
et 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.