Forum Programmation.shell mv conditionnel

Posté par  .
Étiquettes : aucune
0
26
oct.
2006
Bonjour,

Je cherche à écrire un shell qui vérifie l'existence d'un ou plusieurs fichiers (par ex "t*.txt"), et qui , si le ou les fichiers existent les déplace dans un répertoire old; s'ils n'existent pas, le programme sort avec un code de retour 1.

J'ai essayé:

toto="t*.txt*"
if [ -z "$toto" ] ; then
exit 1
else
mv $toto old/"
fi
exit 0

mais cela ne marche que dans le cas ou les fichiers existent déjà.

Merci de votre aide.
  • # erreur dans ton test

    Posté par  . Évalué à 2.

    -z string
    True if the length of string is zero.

    Or la tu veux verifier l'existence d'un fichier, donc
    -e file
    True if file exists.

    regarde l'aide de ton shell sur le sujet.

    K.
    • [^] # Re: erreur dans ton test

      Posté par  . Évalué à 1.

      Merci,

      J'ai essayé ceci:

      #!/bin/bash
      toto="t*.txt*"
      if [ ! -e "$toto" ]
      then
      exit 1
      else
      mv $toto old/
      fi
      exit 0

      Cette fois ci mon script ne renvoie pas d'erreur lors de l'inexistence des fichiers, mais ne les déplace pas.

      si quelqu'un peut m'aider, merci par avance.
    • [^] # Re: erreur dans ton test

      Posté par  . Évalué à 1.

      Merci

      J'ai essayé

      if [ ! -e "$toto" ] à la place de if [ -z "$toto" ] .

      le script ne renvoie plus d'erreur dans le cas ou les fichiers sont absents mais ne deplace plus les fichiers.

      si quelqu'un a une idée, par avance merci.
      • [^] # Re: erreur dans ton test

        Posté par  . Évalué à 1.

        N'aurais tu pas des problemes de droit sur le fichier que tu veux déplacer ?

        Ton script doit bien te dire la raison du non deplacement ?

        Tu lances le script par Cron ?

        Car sinon syntaciquement cela me semble correct (j'ai po tester par contre). Regarde les autres tests possible sur les fichiers, il me semble qu'il y en a un qui verifie si tu as des droits dessus. Au pire un bon vieux ET :)

        K.
        • [^] # Re: erreur dans ton test

          Posté par  . Évalué à 2.

          En relisant ton code, je m'apercois d'une superbe boulette :

          toto="t*.txt*"

          Ne peut pas fonctionner ! Il faut faire une boucle sur les fichiers à la place.

          Soit tu donne 1 seul nom de fichier et dans ce cas, tu peux tester si il existe, soit tu fais une boucle de recherche :

          for i in `ls $toto`
          do
          mv $i ....
          done

          En plus tu pourras mettre un petit affichage des fichiers deplacés.

          Je te conseille quand meme fortement de prendre un manuel du shell (tiens d'ailleurs tu utilises lequel ?).

          Pi les moteurs de recherche sont tes amis aussi :)

          K.
  • # Revoir problématique

    Posté par  . Évalué à 4.

    Je cherche à écrire un shell qui vérifie l'existence d'un ou plusieurs fichiers (par ex "t*.txt"), et qui , si le ou les fichiers existent les déplace dans un répertoire old; s'ils n'existent pas, le programme sort avec un code de retour 1.


    C'est dans le concept même que quelque chose cloche, et c'est pourquoi tu n'arriveras jamais à pondre ton algo.

    " * " peut être substitué par un nombre indéfini de caractères, donc il est évident que le shell va développer cela en une liste des fichiers existants qui dont le nom valide le motif. S'il s'agissait de développer en toutes les combinaisons possibles, tu en obtiendrais une infinité !

    Par contre, tu peux les développer dans un répertoire donné et vérifier s'ils existent tous dans un autre. Dans ce cas, le développement de toto="t*.txt*", effectué à la bonne place, fonctionnera. Mais pour le reste, tu n'as pas besoin d'une boucle : " mv " peut naturellement recevoir plus de deux arguments, auquel cas le dernier doit être un répertoire :

    mv fichier1 fichier2 fichier3 monrepertoire/

    Et si un des fichiers est inexistant, c'est la commande mv elle-même qui échouera et renverra ton code 1.

Suivre le flux des commentaires

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