Forum Linux.débutant Supprimer une grande quantité de fichiers impossible

Posté par  .
Étiquettes : aucune
0
24
déc.
2008
Bonjour,

Mon serveur mail utilise qmail et je viens de m'apercevoir que le disque était plein !

J'ai commencé par faire un peu de ménage dans certaines boîtes mails mais en fait le problème viens de la boîte mail root/admin qui reçoit tous les mailer-daemon & co.

J'ai voulu vider le répertoire new de son Maildir avec un rm -f *, mais le nombre de mails stockés dans le répertoire semble trop important (+ de 2 Go de mails) :

> Soit j'obtiens le message "Argument list too long"
> Soit ma session se coupe toute seule et je dois me reconnecter

Quelqu'un aurait une idée ?

Merci
  • # screen et xargs

    Posté par  (site web personnel) . Évalué à 4.

    Salut,

    1. Toujours faire ce genre d'opération dans un screen : si tu es déconnecté, tu te reconnectes et tu fais un screen -d -r pour récupérer ton screen
    2. xargs est ton ami : ls | xargs rm -f
    (à faire dans le bon répertoire, évidemment)
    Le problème avec ta méthode est que bash récupère la liste de tous les fichiers en développant le * puis qu'il essaie de passer la liste directement en argument de rm.

    --
    Guillaume
    • [^] # Re: screen et xargs

      Posté par  . Évalué à 6.

      find . -exec rm -f {} \;

      Attention de bien indiquer le bon répertoire
    • [^] # Re: screen et xargs

      Posté par  (site web personnel) . Évalué à 2.

      La feinte, c'est si un des noms de fichiers contient un espace. On peut le contourner avec un truc du style:

      xargs -i rm -f ./{}

      ou

      xargs -0 rm -f

      mais on se retrouve à nouveau avec le problème de la ligne de commande trop longue. Alors, comment avoir un nombre limité d'arguments par commande (histoire d'éviter de multiplier les processus "rm"). Et bien, je ne sais pas, et je suis preneur pour la solution!
  • # find

    Posté par  (site web personnel) . Évalué à 5.

    C'est une limitation du shell, ton "*" est remplacé par un trop grand nombre de paramètres. Find est un de tes amis dans ces cas là.

    find /var/qmail/mails/root/ -print | xargs /bin/rm

    /var/qmail/mails/root/ est bien sûr à remplacer par ton répertoire à traiter.

    Avec les paramètres de find, tu peux aussi n'effectuer l'action que sur les fichiers vieux de plus de N jours (ou minutes sur certaines versions de find).
    • [^] # Re: find

      Posté par  (site web personnel) . Évalué à 3.

      On peut éviter le pipe vers xargs, et les problèmes de noms de
      fichiers vicieux (qui ne doivent pas se poser ici) --- voir les options
      -print0 de find et -0 de xargs.

      find /var/qmail/mails/root -type f -exec rm -f {} +

      Sans l'option -type f, il faut peut-être reconstituer les trois
      sous-répertoires cur, new et tmp et vérifier leurs permissions.

      La remarque sur l'ancienneté est judicieuse, il serait bon de lire
      quelques messages récents avant de tout nettoyer ;).
  • # Ok ça marche

    Posté par  . Évalué à 2.

    Super Merci, j'ai lancé la commande

    ls | xargs rm -f

    Pendant 20 minutes, mon espace disque utilisé a eu tendance à augmenter (probablement dû à un fichier de calcul temporaire), puis là depuis 10minutes, l'espace disque utilisé diminue tout doucement, donc la suppression fonctionne.

    A ce rythme, la suppression devrait se terminer dans une petite heure.

    Merci
    • [^] # Re: Ok ça marche

      Posté par  . Évalué à 2.

      J'oublie l'essentiel :

      Bonnes fêtes de fin d'année à tous !
    • [^] # Re: Ok ça marche

      Posté par  (site web personnel) . Évalué à 5.

      bon sinon y avait bcp plus simple: rm -rf /le/rep/parent/ (sans *)
      suivi d'un mkdir
      • [^] # Re: Ok ça marche

        Posté par  . Évalué à 3.

        Heu .... même un rm -rf . tout seul dans le répertoire aurait marché, sans mkdir (comme le shell se trouve encore sur le répertoire courant, il refusera de le supprimer à la fin ...).
        • [^] # Re: Ok ça marche

          Posté par  . Évalué à 2.

          L'idée est bonne mais :

          [0]~/temp/temp$ ls
          tata toto #toto# toto~
          [0]~/temp/temp$ rm -rf .
          rm: ne peut enlever « . » or « .. »
          [1]~/temp/temp$ ls
          tata toto #toto# toto~
          [0]~/temp/temp$
          • [^] # Re: Ok ça marche

            Posté par  . Évalué à 2.

            Au temps pour moi, j'ai trop vite dégainé mon commentaire ... La solution la plus simple est donc bien la tienne, rm -rf + mkdir.
            • [^] # Re: Ok ça marche

              Posté par  . Évalué à 2.

              Enfin, pas la tienne, mais bon ... encore dégainé trop vite.
        • [^] # Re: Ok ça marche

          Posté par  (site web personnel) . Évalué à 2.

          Ah, toi tu n'a jamais fait l'expérience suivante:

          $ mkdir /tmp/toto
          $ cd /tmp/toto
          $ rm -rf /tmp/toto
          $ ls
          $ ls /tmp
          $ ls /tmp/toto

          le dossier est supprimé, mais, de la même façon que supprimer un
          fichier de log apache sans le redémarrer, l'inode n'est pas entièrement
          détruit tant qu'il existe une référence ouverte.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.