J'ai un dossier qui contient de nombreux fichiers et "rm -rf" prend beaucoup de temps. Existe-t-il un moyen plus rapide de supprimer un répertoire et son contenu (sous-répertoires, etc.) ?
Réponses
Trop de publicités?Vous pourriez essayer de dissocier l'inode du répertoire, mais vous vous retrouveriez alors avec un grand nombre de fichiers orphelins que vous ne pourriez pas gérer. fsck
volonté de l'information sur.
rm
est aussi bon que possible.
Quelques personnes mentionnent des cas limites où certaines choses sont plus rapides que d'autres. Mais assurons-nous que nous comparons les meilleures versions des mêmes choses.
Si vous voulez supprimer un répertoire et tout ce qu'il contient, je vous le suggère :
rm -rf path/to/directory
rm
volonté à l'intérieur la liste des fichiers et des répertoires qu'il va supprimer. Et tout cela dans une version compilée de C . C'est pour ces deux raisons qu'il est le plus rapide.
Ce n'est pas du tout la même chose que rm -rf path/to/directory/*
qui élargir au niveau Shell et transmettre une série d'arguments à rm
. Ensuite rm
doit les analyser et se recomposer à partir de chacun d'entre eux. C'est beaucoup plus lent.
Comme un "point de repère" qui compare les find path/to/directory -exec {} \;
est un non-sens. Ce qui se passe rm
une fois par fichier trouvé. C'est donc lent. Il est possible de trouver des arguments de commandes de construction de type xargs avec -exec rm {} +
mais c'est tout aussi lent que l'expansion. Vous pouvez appeler -delete
qui utilise un unlink
au noyau (comme rm
), mais cela ne fonctionnera que pour les fichiers dans un premier temps.
En d'autres termes, à moins de jeter le disque dans du magma liquide et chaud, rm
est roi .
Dans le même ordre d'idées, les différents systèmes de fichiers suppriment les données à des rythmes différents 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, qui a tendance à gérer les suppressions assez rapidement.
Ou utilisez un disque plus rapide. Si vous disposez de beaucoup de mémoire vive, l'utilisation de /dev/shm
(un disque RAM) pourrait être une idée.
Si vous n'avez pas besoin de l'espace libre, le moyen le plus rapide est de retarder la suppression et de la faire en arrière-plan :
- mkdir .delete_me
- mv big-directory-that-i-want-gone .delete_me
Ensuite, il faut créer un crontab qui l'exécute en arrière-plan, à un moment calme, avec une faible probabilité d'entrées/sorties :
3 3 * * * root ionice -c 3 nice find /path/to/.delete_me -maxdepth 1 ! -name \. -exec echo rm -rf "{}" +
Notes :
- vérifiez vos résultats 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é une astuce pour exécuter plusieurs rm 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 effectuer un parcours en profondeur.
-
-maxdepth pour limiter la profondeur de la traversée des répertoires afin de ne pas finir par é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 (voir 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 vais créer un nouveau ensemble de données pour tout grand projet. Si vous vous y prenez à l'avance, vous pouvez simplement "zfs détruire" un système de fichiers lorsque vous avez terminé ;-)
J'ai utilisé les instructions du wiki zfsonlinux pour installer Ubuntu sur ZFS nativement : https://github.com/zfsonlinux/zfs/wiki/Ubuntu-18.04-Root-on-ZFS
Parfois, find $DIR_TO_DELETE -type f -delete
est plus rapide que rm -rf
.
Vous pouvez également essayer mkdir /tmp/empty && rsync -r --delete /tmp/empty/ $DIR_TO_DELETE
.
Enfin, si vous devez supprimer le contenu d'une partition entière, la méthode la plus rapide sera probablement la suivante umount
, mkfs
et re- mount
.
Je pense que le problème est qu'il n'y a pas de méthode parfaite pour supprimer un très grand répertoire et l'ensemble de son contenu sans un véritable système d'archivage indexé qui comprend la suppression des liens et ne pense pas qu'il y a des fichiers manquants comme dans FSCK. Il doit y avoir une confiance.
Par exemple, j'ai un zoneminder qui fonctionne pour un terrain de golf. J'ai construit un raid linux de 1,5 TB pour gérer l'immense quantité de données qu'il capture par jour (12 flux de caméras), et je ne comprends pas comment il a pu fonctionner sur un disque de 120 GB. Pour faire court, le dossier contenant toutes les données capturées représente environ 1,4 TB de son espace de stockage. Beaucoup de choses à purger
Il n'est pas agréable de devoir réinstaller ZM et de purger l'ancienne bibliothèque de 1,4 To, car la suppression des anciennes images peut prendre un à deux jours.
Un véritable système de fichiers indexés permet de supprimer un répertoire et sait que les données qui s'y trouvent sont mortes et que la suppression des données est une perte de temps et de ressources informatiques. La mise à zéro des données supprimées devrait être une option. RM prend trop de temps dans le monde réel sur ext4.
Réponse : La déliaison récursive de tous les fichiers serait légèrement plus rapide, mais vous devriez toujours prévoir un temps pour exécuter FSCK.
Créez un script exécutant une commande "FOR" récursive qui peut "délier" tous les fichiers sous vos dossiers, puis simplement rm ou rmdir tous les dossiers pour les nettoyer. Lancer manuellement FSCK pour mettre à zéro le reste des données quand c'est pratique. Je suis un peu paresseux, je 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 grand nombre de fichiers que vous devrez purger régulièrement est de placer le répertoire sur son propre système de fichiers ( par exemple , partition). Ensuite, lorsque vous avez besoin de la purger, démontez-la, exécutez une commande mkfs
et le remonter. Par exemple OpenBSD conseille de le faire pour /usr/obj
où de nombreux fichiers sont créés lors de la construction du système et doivent être supprimés avant la construction suivante.