[Unix] déplacer fichier selon chaine contenu

Résolu
jon_chninkel Messages postés 8 Statut Membre -  
jon_chninkel Messages postés 8 Statut Membre -
bonjour

je suis sous unix (aix).
j'aimerais écrire un script qui me permette de déplacer tous les fichiers du répertoire REP1 contenant une chaine donnée vers un autre répertoire REP2.

exemple
sh monscript.sh CHAINE REP1 REP2

je n'ai rien trouvé dans le forum ! peut-être que je m'y suis mal pris.

je pourrai me lancer avec une boucle sur chaque fichier et tester le retour d'un grep, mais je ne trouverai pas ça très propre.

si vous avez un avis sur la question et des conseils, eje suis preneur.

merci
bonne journée !
Jon

10 réponses

  1. tafiscobar Messages postés 1281 Statut Contributeur 177
     
    salut, ben il n'y a pas d'autre moyen. Il n'y a aucun moyen de lire ce qui se trouve dans un fichier sans l'avoir ouvert. Il n'y a aussi aucun moyen de lire d'un seul coup plusieurs fichiers, a moins de travailler avec les blocs du disque dur mais la c'est une autre paire de manche (programmation bas niveau).
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Arf, j'ai mis du temps à poster après la rédaction de mon post ;-(

      Désolé pour le doublon ;-))
      0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    je pourrai le lancer avec une boucle sur chaque fichier et tester le retour d'un grep, mais je ne trouverai pas ça très propre.
    Euh... Ben je vois pas comment faire sans une boucle et sans "grep".
    Donc à mon avis c'est LA solution.

    ;-))
    0
  3. jon_chninkel Messages postés 8 Statut Membre
     
    bonjour

    okay okay merci pour ces encouragements ;-)
    à coup de for & de grep, je le posterai quand j'aurai réussi.

    bye bye
    0
  4. jon_chninkel Messages postés 8 Statut Membre
     
    bonjour

    okay okay merci pour ces encouragements ;-)
    à coup de for & de grep, je le posterai quand j'aurai réussi.

    bye bye
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jon_chninkel Messages postés 8 Statut Membre
     
    C'est bon !

    #!/bin/sh
    # arg1 = chaine
    # arg2 = rep source
    # arg3 = rep cible
    REP=`ls $2`
    echo "Début Recherche - Déplacement"

    for FICHIER in $REP
    do
    if [ ! -d $2/$FICHIER ] ; then
    if [ "`head -1 $2/$FICHIER | grep $1'`" ] ; then
    echo "$FICHIER déplacé"
    mv $2/$FICHIER $3/$FICHIER;
    fi
    fi
    done

    echo "."

    Chouette. Maintenant je dois l'éprouver.

    bye bye
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      il me semble qu'on n'a pas besoin de for pour faire ça.

      rgrep cherche de façon recursive
      grep avec globalisation
      ou combinaison find avec grep

      lami20j
      0
    2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
       
      Salut lami20j,

      La récursivité agit sur les répertoires, là notre ami "jon" ne parle pas de récursivité dans les sous-répertoires (à moins que je n'ai pas bien saisi l'énoncé du problème et dans ce cas là je m'en excuse par avance), mais d'une recherche dans UN répertoire d'une chaîne contenue dans les fichiers dudit répertoire et d'un déplacement le cas échéant.

      Et même si récursivité il y avait, on serait quand même obligé d'utiliser une boucle pour lire chacun des fichiers, enfin il me semble ;-))
      0
    3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
       
      Salut,

      mais d'une recherche dans UN répertoire d'une chaîne contenue dans les fichiers dudit répertoire et d'un déplacement le cas échéant.

      Encore mieux.

      on serait quand même obligé d'utiliser une boucle pour lire chacun des fichiers, enfin il me semble ;-))

      pour l'instant je ne dit rien. je vais essayer ce soir puisque je crois que c'est possible, sinon je n'aurai pas écrit ;)

      lami20j
      0
    4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
       
      re-

      Bon, j'ai rien dit et t'as raison ;-((

      Voilà les tests sans boucle, mais avec "awk" :
      [jp@MDK tmpfs] $ ls -1
      
      fich.1
      fich.10
      fich.2
      fich.3
      fich.4
      fich.5
      fich.6
      fich.7
      fich.8
      fich.9
      le_rep/
      
      [jp@MDK tmpfs] $ cat fich.*
      
      Je contiens la chaîne Bonjour
      Je contiens la chaîne Aurevoir
      Je contiens la chaîne Aurevoir
      Je contiens la chaîne Bonjour
      Je contiens la chaîne Aurevoir
      Je contiens la chaîne Bonjour
      Je contiens la chaîne Aurevoir
      Je contiens la chaîne Bonjour
      Je contiens la chaîne Aurevoir
      Je contiens la chaîne Bonjour
      
      [jp@MDK tmpfs] $ ls le_rep/
      
      [jp@MDK tmpfs] $ grep Bonjour $(ls -1) | cp $(awk -F":" '{ print $1 }') le_rep/
      
      [jp@MDK tmpfs] $ ls le_rep/
      
      fich.1  fich.3  fich.5  fich.7  fich.9
      
      [jp@MDK tmpfs] $ cat le_rep/*
      
      Je contiens la chaîne Bonjour
      Je contiens la chaîne Bonjour
      Je contiens la chaîne Bonjour
      Je contiens la chaîne Bonjour
      Je contiens la chaîne Bonjour
      
      [jp@MDK tmpfs] $ 
      Merci lami20j ;-))
      0
    5. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
       
      Re,

      Ben, de rien.
      C'est toi qui a fait le boulot ;)

      lami20j
      0
  7. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    voilà ma version
    lami20j@debian:~$ ls -1 salut*
    salut1
    salut2
    salut3
    salut4
    salut5
    salut6
    salut7
    salut8
    salut9
    lami20j@debian:~$ cat salut*
    Bonjour
    Au revoir
    Bonjour
    Au revoir
    Bonjour
    Au revoir
    Bonjour
    Au revoir
    Bonjour
    lami20j@debian:~$ ls -l trash/salut*
    ls: trash/salut*: Aucun fichier ou répertoire de ce type
    lami20j@debian:~$ egrep -l Bonjour salut* | xargs -i{} cp {} trash/
    lami20j@debian:~$ ls -l trash/salut*
    -rw-r--r--  1 lami20j lami20j 8 2006-09-08 18:57 trash/salut1
    -rw-r--r--  1 lami20j lami20j 8 2006-09-08 18:57 trash/salut3
    -rw-r--r--  1 lami20j lami20j 8 2006-09-08 18:57 trash/salut5
    -rw-r--r--  1 lami20j lami20j 8 2006-09-08 18:57 trash/salut7
    -rw-r--r--  1 lami20j lami20j 8 2006-09-08 18:57 trash/salut9
    lami20j@debian:~$ cat trash/salut*
    Bonjour
    Bonjour
    Bonjour
    Bonjour
    Bonjour
    lami20j@debian:~$  
    lami20j

    P.S. Jipicy c'est toi qui m'a appris xargs ;)
    0
  8. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    cp $(egrep -l Bonjour salut*) trash/
    ;-))
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Ben, voilà.

      Les maîtres doivent se reveiller de temps en temps.
      Je n'aime pas l'idée d'avoir une seule solution ;)

      TMTOWTDI

      There's More Than One Way To Do It

      That's wonderful!!!

      Merci jipicy

      lami20j
      0
  9. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Bon on va clôturer là les remerciements : Merci nous et merci les z'autres !

    ;-))
    0
  10. jon_chninkel Messages postés 8 Statut Membre
     
    Merci donc à tous, dont moi-même ;-)
    bon week-end
    0
  11. jon_chninkel Messages postés 8 Statut Membre
     
    ma solution ne marche pas bien, en fait elle semble tout me déplacer ;-(

    je réessayerai les autres
    0