web-dev-qa-db-fra.com

Supprimer des millions de fichiers

J'avais un répertoire à remplir avec 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?

38
Corepuncher

Plus vite n'est pas nécessairement ce que vous voulez. Vous souhaiterez peut-être exécuter plus lentement , de sorte que la suppression consomme moins de ressources pendant son exécution.

Utilisez Nice (1) pour réduire la priorité d’une commande.

Nice find . -name "*.gif" -delete

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 pouvez également mieux contrôler la priorité des E/S.

ionice -c 2 -n 7 find . -name "*.gif" -delete

Si cela ne le fait pas, vous pouvez également ajouter un sommeil pour vraiment le ralentir.

find . -name "*.gif" -exec sleep 0.01 \; -delete
44
John Kugelman

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):

ionice -c3 find . -name '*.gif' -delete

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.

22
user2719058

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 défini sur la valeur xargs), ce qui est bien meilleur que appelant rm sur chaque fichier. Donc non, il n'y a certainement pas de moyen plus rapide.

L'utilisation de Nice (ou renice sur un processus en cours) 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 fonctionne beaucoup avec lui), la machine entière reste bloquée. Le noyau modifié pour une utilisation en temps réel pourrait être une solution.

Ce que je voudrais faire sur le serveur est de manuellement laisser les autres processus faire leur travail - inclure des pauses pour que le serveur "respire":

find . -name "*.gif" > files
split -l 100 files files.
for F in files.* do
    cat $F | xargs rm
    sleep 5 
done

Cela attend 5 secondes tous les 100 fichiers. Cela prendra beaucoup plus de temps, mais vos clients ne devraient pas remarquer de retard.

13
Tomas