Negation et instruction find

Bonjour et bonne année a tous,

J'ai un gros tas de fichiers et la plupart m'encombre plus qu'autre chose, je cherche donc a virer tous les inutiles.
J'ai reussi avec l'instruction find a trouver et a copier ceux qui m'interressent:

find ./ -name '*.swf' -print -ok cp {} ~/Desktop/Site1 \;

Maintenant j'aimerais faire l'operation inverse, detruire ceux qui ne m'interressent pas et laisser les autres tranquilles. C'est la négation de la condition qui me pose probleme, la destruction se faisant par rm -f {} ne devrait pas poser de probleme.
Si quelqu'un pouvait me donner un coup de main
Merci d'avance
Nick
Configuration: Linux
Firefox 2.0.0.1

6 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    Re,

    juste pour te donner un exemple avec la negation avec find (il faut lire man find:-))

    si tu fait des recherche dans le répertoire courant tu peux utiliser seulement le . (qui designe le répertoire courant)
    find . -not -name '*.swf' -a -not -name '.'
    ou
    find . ! -name '*.swf' -a ! -name '.'
    1. Modérateur
      Salut,

      Déjà tu peux deplacer tes fichiers que tu veux sauvegarder avec

      find ./ -name '*.swf' -print -ok mv {} ~/Desktop/Site1 \; 


      Une fois les fichiers deplacés, il faut savoir ce que tu veux supprimer. Une négation n'est plus nécessaires puisque les fichiers .swf on été deplacés.

      Si tu veux supprimer tout fichier ordinaire alors

      find ./ -type f -print -ok rm -f {} ~/Desktop/Site1 \; 
      sinon
      find ./ -name 'fichier a supprimer' -print -ok rm -f {} ~/Desktop/Site1 \; 
      Mais avant tout, précise plutôt ce que tu veux supprimer.
      Il ne faut pas jouer avec la commande rm de cette façon avant de savoir ce qu'on fait.
      1. Bonjour,
        Tout d'abord merci de votre aide, j'ai une arborescence avec des tas de fichiers en vrac, pages html, .gif etc... Je veux tout enlever sauf les animaations flash et garder l'arborescence. En effet celle ci me donne deja un classement par sujet que je desire conserver.
        Par prudence j'ai fait une copie du total avant de jouer avec rm, mais merci du conseil. En fait je voulais supprimmer tous fichier normal ne correspondant pas au filtre *.swf. Puis dans un deuxieme temps mais la je ne me suis pas encore penché sur le probleme, chercher tous les repertoires vides et les detruire, j'aurais a ce moment la une arborescence triée avec mes données directement exploitable.
        J'apprecie cette puisssance d'Unix meme si c'est assez dur de s'y mettre,
        merci pour tous je vais me pencher sur tous tes conseils
        Nick
        1. Modérateur
          Re,

          je viens de me rendre compte qu'à cause de copier/coller j'ai écrit des enormes bêtises ici

          ça c'est correct

          supprime les fichiers qui n'ont pas l'extension .sxw sauf le répertoire courant
          find ./ ! -name '*.sxw' -a ! -name './' -type f -exec rm -vf {} \; 
          et ça aussi
          déplace le fichier .sxw dans Site1
          find ./ -name '*.swf' -exec mv -v {} /home/user/Desktop/Site1 \; 


          la 1ère commande on peut l'écrire aussi de cette manière
          find ./ ! -name '*.sxw' -type f -exec rm -vf {} \; 
          vu qu'on utilise -type f

          1. Modérateur
            Salut,

            Puis dans un deuxieme temps mais la je ne me suis pas encore penché sur le probleme, chercher tous les repertoires vides et les detruire
            Tu peux essayer un truc du genre :
            find . ! -name '.' -type d -exec rmdir -p --ignore-fail-on-non-empty {} 2>/dev/null \;
            Explications :
            find . cherche depuis le répertoire courant
            ! -name '.' ne pas tenir compte du répertoire courant
            -type d uniquement les répertoires
            -exec rmdir exécute la commande "effacer les répertoires vides"
            -p effacer les répertoires parents s'ils deviennent vides
            --ignore-fail-on-non-empty empêche la commande d'échouer en cas de répertoire non-vide
            2>/dev/null envoie les messages d'erreurs à la trappe

            ;-))
            1. Salut et merci,

              1ere partie de l'operation nettoyage passée, résultat nickel avec ceci:
              find ./Site1 -type f -not -name '*.swf' -exec rm -f {} \;
              Mon probleme venait de ce que je mettais l'operateur not pas a la bonne place.
              je tapais -name !'*.swf' il appreciait pas du tout.
              Avant de "m'amuser" avec rm j'ai essayé avec -print, y avait du taf, incroyable... Merci Unix ;-)
              Merci du coup de main je m'attelle a la suite !

              A bientot