Je me suis fait remplir des millions d'images GIF. Trop nombreux pour la commande rm.
J'ai essayé la commande de recherche comme ceci:
find . -name "*.gif" -print0 | xargs -0 rm
Le problème, c’est que ma machine est complètement endommagée et entraîne des délais d’expiration pour les clients car c’est un serveur.
Existe-t-il un moyen plus rapide de supprimer tous ces fichiers ... sans verrouiller la machine?
rm -rf
serait plus rapide. Ça vaut le coup d'essayer.Réponses:
Plus vite n'est pas nécessairement ce que vous voulez. Vous souhaiterez peut-être exécuter plus lentement , de sorte que la suppression engendre moins de ressources pendant son exécution.
Utilisez gentil (1) pour réduire la priorité d’une commande.
Pour les processus liés aux E / S, nice (1) pourrait ne pas être suffisant. Le planificateur Linux prend en compte les E / S, pas seulement le processeur, mais vous souhaitez peut-être un contrôle plus précis de la priorité des E / S.
Si cela ne le fait pas, vous pouvez également ajouter un sommeil pour vraiment le ralentir.
la source
sleep
ajout - J'avais des problèmes d'étouffement des serveurs sur l'IO malgré l'utilisationionice -c 3
. Cela ajoute de manière significative au temps nécessaire pour effacer les fichiers (bien sûr), mais je préfère attendre que de déposer la demande ...Puisque vous utilisez Linux et que cette tâche est probablement liée aux E / S, je vous conseille de donner à votre commande la priorité du planificateur d'E / S en mode veille à l'aide de
ionice(1)
:En comparant avec votre commande d'origine, je suppose que cela pourrait même vous épargner encore plus de cycles de processeur en évitant le tube
xargs
.la source
find ... -exec
cas où cela aurait du sens.find(1)
documentation le prétend. :) Et il devrait être évident que se laisserfind
supprimer lui-même est plus efficace que de forger unerm
commande pour cela.ionice -c3
réduit le prio pour qu'il ne soit exécuté que lorsque l'IO est inactif, sinon c'est parfait. Notez que, comme il-delete
n’est pas standard pour la recherche, vous pouvez faire de même (y compris le retour d’information que cela fonctionne) à l’aide de cette commande:ionice -c 3 find . -name '*.gif' -exec echo {} \; -exec rm {} \;
- Lent mais pas de processus importants.Non.
Il n'y a pas de moyen plus rapide, mis à part le formatage souple du disque. Les fichiers sont donnés à rm à la fois (jusqu’à la limite de la ligne de commande, il peut également être réglé à la
xargs
), ce qui est bien mieux que d'appeler rm sur chaque fichier. Donc non, il n'y a certainement pas de moyen plus rapide.En utilisant
nice
(ourenice
sur un processus en cours d'exécution) n'aide que partiellement, car c'est pour planifier la ressource CPU , pas le disque! Et l'utilisation du processeur sera très faible. C’est une faiblesse de Linux - si un processus «mange» le disque (c’est-à-dire qu’il travaille beaucoup avec lui), toute la machine reste bloquée. Le noyau modifié pour une utilisation en temps réel pourrait être une solution.Ce que je ferais sur le serveur est de laisser manuellement les autres processus faire leur travail - inclure des pauses pour garder le serveur "respirer":
Cela attend 5 secondes tous les 100 fichiers. Cela prendra beaucoup plus de temps, mais vos clients ne devraient pas remarquer de retard.
la source
rm *
, il se dilate*
dans la ligne avec tous les noms de fichiers et le transmettre àrm
? C'est incroyablement stupide. Pourquoi serait shell Développer les wildcards?*
ou/*
et donner un doute à une telle décision de l'utilisateur.Si le nombre de fichiers à supprimer dépasse largement le nombre de fichiers laissés, ce n'est peut-être pas la méthode la plus efficace pour parcourir l'arborescence des fichiers à supprimer et effectuer toutes les mises à jour du système de fichiers. (Cela revient à faire une gestion maladroite de la mémoire comptée en références, visiter chaque objet dans un grand arbre pour laisser tomber sa référence, au lieu de tout mettre en ordre en une seule étape, puis balayer tout ce qui est accessible à nettoyer.)
C’est-à-dire cloner les parties de l’arbre à conserver sur un autre volume. Recréez un nouveau système de fichiers vierge sur le volume d'origine. Copiez les fichiers conservés dans leur chemin d'origine. Ceci est vaguement similaire à la copie d'une récupération de place .
Il y aura des temps morts, mais cela pourrait être mieux que de mauvaises performances continues et des interruptions de service.
Cela peut ne pas être pratique dans votre système et votre situation, mais il est facile d'imaginer des cas évidents où c'est la voie à suivre.
Par exemple, supposons que vous vouliez supprimer tous les fichiers d'un système de fichiers. Quel serait le but de récursir et de supprimer un par un? Démontez-le et faites un "mkfs" sur la partition pour créer un système de fichiers vide.
Ou supposez que vous vouliez supprimer tous les fichiers sauf une demi-douzaine de fichiers importants? Sortez la demi-douzaine et ... "mkfs" par dessus.
Finalement, il y a un seuil de rentabilité quand il y a suffisamment de fichiers qui doivent rester, qu'il devient moins coûteux de faire la suppression récursive, en tenant compte des autres coûts, comme tout temps d'arrêt.
la source
As-tu essayé:
Le signe + à la fin fera en sorte que find inclue plus de fichiers pour que la commande unique rm soit exécutée. Cochez cette question pour plus de détails.
la source
-delete
) qui ne doit pas toujours être là.