Supprimer des milliards de fichiers d'un répertoire tout en observant la progression

36

J'ai un répertoire de 30 To contenant des milliards de fichiers, qui sont officiellement tous des fichiers JPEG. Je supprime chaque dossier de fichiers comme ceci:

sudo rm -rf bolands-mills-mhcptz

Cette commande est exécutée et ne montre rien, que cela fonctionne ou non.

Je veux voir en train de supprimer des fichiers ou quel est l'état actuel de la commande.

Junaid Farooq
la source
19
Pas de réponses: Parfois, il est plus rapide de sauvegarder les éléments que vous souhaitez conserver, de les formater et de les restaurer. Autres réponses: unix.stackexchange.com/questions/37329/…
Eric Towers
2
Si vous voulez simplement avoir une idée de la progression, plutôt que de savoir quels fichiers ont été supprimés, vous pouvez exécuter "df / dev / sd_wwhat_the_drive_is".
jamesqf
11
Comment vous êtes-vous retrouvé avec des milliards de fichiers dans un seul répertoire?
Courses de légèreté avec Monica Le
1
@ MichaelHampton Mais si les fichiers ne constituent pas un jeu de données séparé, cela peut prendre beaucoup de temps. serverfault.com/questions/801074/…
v7d8dpo4
5
Des milliards de fichiers, hein? Essayez rm -ri. Ça va être amusant!
OldBunny2800

Réponses:

98

Vous pouvez utiliser rm -vpour rmsupprimer une ligne par fichier. De cette façon, vous pouvez voir que cela rmfonctionne effectivement pour supprimer des fichiers. Mais si vous avez des milliards de fichiers, tout ce que vous verrez est que cela rmfonctionne toujours. Vous n'aurez aucune idée du nombre de fichiers déjà supprimés et du nombre restant.

L'outil pvpeut vous aider avec une estimation de progrès.

http://www.ivarch.com/programs/pv.shtml

Voici comment invoquer rmavec pvun exemple de sortie

$ rm -rv dirname | pv -l -s 1000 > logfile
562  0:00:07 [79,8 /s] [====================>                 ] 56% ETA 0:00:05

Dans cet exemple artificiel, j'ai dit pvqu'il y avait des 1000fichiers. La sortie de pvmontre que 562 sont déjà supprimés, que le temps écoulé est de 7 secondes et que l'estimation à effectuer est de 5 secondes.

Quelques explications:

  • pv -lfait pvcompter par des nouvelles lignes au lieu d'octets
  • pv -s numberindique pvle total pour qu'il puisse vous donner une estimation.
  • La redirection vers logfileà la fin est pour une sortie propre. Sinon, la ligne d'état de pvest mélangée avec la sortie de rm -v. Bonus: vous aurez un fichier journal de ce qui a été supprimé. Mais attention, le fichier deviendra énorme. Vous pouvez également rediriger vers /dev/nullsi vous n'avez pas besoin d'un journal.

Pour obtenir le nombre de fichiers, vous pouvez utiliser cette commande:

$ find dirname | wc -l

Cela peut aussi prendre beaucoup de temps s’il ya des milliards de fichiers. Vous pouvez également utiliser pvici pour voir combien il a compté

$ find dirname | pv -l | wc -l
278k 0:00:04 [56,8k/s] [     <=>                                              ]
278044

Ici, il est indiqué qu'il a fallu 4 secondes pour compter 278 000 fichiers. Le nombre exact à la fin ( 278044) est la sortie de wc -l.

Si vous ne voulez pas attendre le décompte, vous pouvez deviner le nombre de fichiers ou utiliser pvsans estimation:

$ rm -rv dirname | pv -l > logfile

De cette façon, vous n'aurez aucune estimation à terminer, mais au moins vous verrez combien de fichiers sont déjà supprimés. Rediriger vers /dev/nullsi vous n'avez pas besoin du fichier journal.


Nitpick:

  • avez-vous vraiment besoin sudo?
  • rm -rest généralement suffisant pour supprimer récursivement. pas besoin de rm -f.
lesmana
la source
5
Belle utilisation de pv, en supposant qu'il ne soit pas trop coûteux de compter les milliards de fichiers ;-). (Cela peut prendre presque autant de temps que ce rmqu'il est supposé mesurer!)
Stephen Kitt
7
@StephenKitt C'est ce qui me dérange vraiment (et beaucoup d' autres) sur l'utilitaire de fichiers Windows: il toujours , sans faillir, compte le nombre et la taille des fichiers avant de supprimer ce qui, à moins que le lecteur est beaucoup plus lent que le processeur, prend presque tant que la suppression réelle!
wizzwizz4
@ wizzwizz4 En effet! L’IIRC ne se limite pas à cela: il vérifie qu’il peut tout supprimer avant de supprimer quoi que ce soit , pour augmenter les chances que les suppressions soient "tout ou rien". Il y a de nombreuses années, j'ai écrit un pilote de système de fichiers pour Windows. Nous avons dû résoudre plusieurs problèmes, dont certains liés à la manière dont Explorer procède à la suppression, mais je ne me souviens pas des détails. (Je me souviens que créer un dossier implique d'écrire et de supprimer un fichier dans le nouveau dossier!)
Stephen Kitt
7
@StephenKitt Peut-être que je me trompe, mais le goulot d'étranglement n'est-il pas, outre l'accès au disque, la sortie du terminal? Je crois que pvla barre de progression n'est rafraîchie qu'une fois par seconde, malgré son entrée. Ainsi, le terminal n'a besoin d'afficher qu'une ligne au lieu d'une tonne par seconde. pvn'a besoin que d'incrémenter un compteur pour chaque nouvelle ligne rencontrée; cela doit être plus rapide que le retour à la ligne, et ainsi de suite pour afficher une ligne dans un terminal. Je pense que fonctionner avec pvce type provoque des suppressions de fichiers plus rapides que simplement rm -rv.
JoL
1
@skywinderrm -rv dirname | pv -l -s $(find dirname | wc -l) > logfile
lesmana
28

Découvrez la réponse de lesmana , elle est bien meilleure que la mienne - en particulier le dernier pvexemple, qui ne prendra pas plus de temps que le silence d'origine rmsi vous le spécifiez à la /dev/nullplace de logfile.

En supposant que votre rmsupporte l'option (probablement parce que vous utilisez Linux), vous pouvez l'exécuter en mode prolixe avec -v:

sudo rm -rfv bolands-mills-mhcptz

Comme plusieurs intervenants l'ont souligné, cela pourrait être très lent en raison de la quantité de sortie générée et affichée par le terminal. Vous pouvez plutôt rediriger la sortie vers un fichier:

sudo rm -rfv bolands-mills-mhcptz > rm-trace.txt

et regarder la taille de rm-trace.txt.

Stephen Kitt
la source
5
Cela peut réellement ralentir la suppression à cause de toute la sortie générée et restituée à un terminal :)
rackandboneman
2
Bien sûr, ça va ralentir. L'écriture de milliards de lignes dans un fichier ne se produit pas en temps zéro.
user207421
23

Une autre option consiste à regarder le nombre de fichiers sur le système de fichiers diminuer. Dans un autre terminal, lancez:

watch  df -ih   pathname

Le nombre d'inodes utilisés diminuera au fur et à mesure de l' rmavancement. (À moins que les fichiers aient généralement plusieurs liens, par exemple si l'arborescence a été créée avec cp -al). Cela suit la progression de la suppression en termes de nombre de fichiers (et de répertoires). dfsans -isuivre en termes d'espace utilisé.

Vous pouvez également iostat -x 4voir les opérations d'E / S par seconde (ainsi que les kiB / s, mais ce n'est pas très pertinent pour les E / S de métadonnées pures).


Si vous souhaitez savoir sur quels fichiers rmsont en cours de travail, vous pouvez en joindre un straceet regarder les unlink()appels système (et getdents) cracher sur votre terminal. par exemple sudo strace -p $(pidof rm). Vous pouvez ^cdétacher le strace rmsans l’interrompre.

J'oublie que si les rm -rchangements de répertoire dans l'arborescence sont supprimés; si donc vous pourriez regarder /proc/<PID>/cwd. Il est possible /proc/<PID>/fdque son répertoire fd soit souvent ouvert. Vous pouvez donc consulter ce répertoire pour voir ce que votre rmprocessus examine actuellement.

Peter Cordes
la source
2
df -ihest en effet un moyen peu coûteux de suivre les rmprogrès.
Stephen Kitt
BTW, cela ne fonctionne pas sur BTRFS, où le nombre d'inodes utilisés est toujours égal à zéro. :( Idem pour FAT32, mais vous n'avez probablement pas des milliards de fichiers sur votre /bootpartition système EFI.
Peter Cordes
4

Bien que toutes les réponses ci-dessus soient utilisées rm, la rmsuppression d’un grand nombre de fichiers peut s'avérer assez lente, comme je l’avais récemment observé lors de l’extraction de fichiers de 100K à partir d’une archive .tar, ce qui a pris moins de temps que leur suppression. Bien que cela ne réponde pas réellement à la question que vous avez posée, une meilleure solution à votre problème pourrait être d’utiliser une méthode différente pour supprimer vos fichiers, telle que l’une des réponses positives à cette question .

Ma méthode préférée personnelle est d'utiliser rsync -a --delete. Je trouve que cette méthode fonctionne assez vite pour que la réponse soit la plus élevée , à savoir que l'auteur a écrit un programme en C que vous auriez besoin de compiler. (Notez que tous les fichiers en cours de traitement seront affichés dans stdout, rm -rvce qui peut ralentir le processus de manière surprenante. Si vous ne voulez pas cette sortie, utilisez rsync -aq --deleteplutôt la redirection vers un fichier.)

L'auteur de cette réponse dit:

Le programme va maintenant (sur mon système) supprimer les fichiers 1000000 en 43 secondes. Le programme le plus proche de cela était rsync -a --delete, qui prenait 60 secondes (ce qui supprime également les suppressions dans l'ordre, mais n'effectue pas non plus une recherche efficace dans l'annuaire).

J'ai trouvé que cela suffit à mes fins. Également potentiellement important de cette réponse, du moins si vous utilisez ext4:

En prévision, il convient de supprimer le répertoire concerné et de le refaire ensuite. La taille des répertoires n’augmente jamais et peut rester médiocre, même avec quelques fichiers, à cause de la taille du répertoire.

Hitechcomputergeek
la source
hein, j'aurais prévu rmet / ou find --deleteêtre efficace. Point intéressant sur la suppression dans l'ordre de tri pour éviter les rééquilibrages de l'arborescence binaire lors de la suppression. Je ne sais pas dans quelle mesure cela s'applique aux autres systèmes de fichiers. XFS n’est pas non plus génial avec des millions de fichiers par répertoire. IDK à propos de BTRFS, mais j’ai l’impression que cela pourrait être bon pour ce genre de chose.
Peter Cordes
Cette deuxième citation ne dépend-elle pas du type de système de fichiers ...
Menasheh
@Menasheh Bon point, j'ai intégré cela dans ma réponse.
Hitechcomputergeek
3

Une chose à faire serait de démarrer le rmprocessus en arrière-plan (sans sortie, il ne sera donc pas ralenti), puis de le surveiller au premier plan avec une simple commande (a) :

pax> ( D=/path/to/dir ; rm -rf $D & while true ; do
...>   if [[ -d $D ]] ; then
...>     echo "$(find $D | wc -l) items left"
...>   else
...>     echo "No items left"
...>     break
...>   fi
...>   sleep 5
...> done )

27912 items left
224 items left
No items left

pax> _

Le find/wccombo peut être remplacé par n’importe quel outil capable de vous donner les unités que vous souhaitez.


(a) Eh bien, relativement simple, comparé à, par exemple, la physique nucléaire, l'hypothèse de Riemann ou ce qu'il faut acheter à ma femme pour Noël :-)


la source
0

Il y a quelque temps, j'ai écrit quelque chose pour imprimer le taux d'impression des lignes. Vous pouvez exécuter rm -rfv | ./counteret il imprimera des lignes par seconde / minute. Bien que ce ne soit pas un progrès direct, il vous donnera un retour d’information sur le taux de progression, peut-être que vous vous rmégarerez dans un système de fichiers réseau ou similaire, peut-être?

Le lien vers le code est ici:

http://www.usenix.org.uk/code/counter-0.01.tar.gz

Ed Neville
la source