IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Debian Discussion :

[Bash] problème de script s'il est lancé avec cron


Sujet :

Debian

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2007
    Messages : 49
    Par défaut [Bash] problème de script s'il est lancé avec cron
    Bonjour,

    Je rencontre un soucis sur un script bash pour retraiter les noms de répertoire/fichier dans une grosse arborescence, afin de virer tout ce qui est accents et caractères spéciaux.

    Quand je l'exécute en ligne de commande, tout va bien.

    Par contre quand je l'exécute avec cron, ca part en vrille. Apparemment, ca viendrait de mes variables, chargées de séparer le nom du fichier, de celui du directory. Voici les principales lignes du script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    #!/bin/bash
    rootDir="/home/toto"
     
    renomeFile() {
       # chemin du dossier parent
      d=`echo "${*}" | sed -e 's/^\(.*\/\)[^\/]*/\1/'`
       # nom du fichier/dossier courant
      f=`echo "${*}" | sed -e 's/^.*\/\([^\/]*\)/\1/'`
       # traitement des accents
      m=`echo "${f}" | unaccent CP850`
       # reassemblage du nom de fichier
      if [ ${f} != ${m} ] ; then
        mv "${*}" "${d}${m}"
      fi
    }
     
    for i in 1 2 3 4 5 6 7 8 9 10; do
      find -P $rootDir -mindepth $i -maxdepth $i -ctime -4 | while read xDir ; do
        if [ -d "$xDir" ]; then   
          renomeDir $xDir        ## j'ai pas mis cette fonction car elle est quasi similaire à la suivante
        elif [ -f "$xDir" ]; then
          renomeFile $xDir
        fi
      done
    done;
    Un petit exemple concret, on part de:
    /home/toto/A110914 à lulu.txt
    et voici les valeurs de chaque variable:
    ${*}= /home/toto/A110914 à lulu.txt
    ${d}= /home/toto/à lulu.txt ## normalement, il devrait trouver /home/toto/
    ${f}= A110914 à lulu.txt
    ${m}= A110914 a lulu.txt

    et donc il arrive à:
    /home/toto/à lulu.txtA110914 a lulu.txt

    Le script se trompe donc sur la construction du dossier parent, alors qu'il le fait correctement quand je le lance à la mimine...
    Pour préciser un peu le contexte, je traite une arborescence sur une partition ext3 (ISO-8859-1) qui est enrichie par des utilisateurs windows, grâce à samba. Les caractères accentués/spéciaux n'apparaissent pas clairement sur linux (ca affiche des trucs bizarres), mais exécuté en ligne de commande, ce script marche nikel...

    Si quelqu'un avait une idée, ca serait bien sympa.

    Merci d'avance.

    Muad'Dib

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    La crontab est exécutée sans environnement, donc c'est à toi de définir un environnement dans ton script, soit en sourçant ton ".bashrc' soit en définissant tes variables en début de script ($PATH notamment).

    Ensuite plutôt que des pipes et commandes inutiles, pour extraire tes chemins et noms de fichiers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ A='/home/toto/A110914'
     
    $ echo ${A%/*}
    /home/toto
     
    $ dirname ${A}
    /home/toto
     
    $ echo ${A##*/}
    A110914
     
    $ basename ${A}
    A110914
     
    $

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2007
    Messages : 49
    Par défaut
    Impeccable, tes informations vont bien m'aider^^

    J'vais aller paufiner tout ca, et j'vous laisserais des nouvelles ensuite.

    Merci beaucoup pour ces conseils, et bonne journée

    EDIT: après modification des 2 lignes qui séparent le nom du directory (avec basename et dirname), le script marche au poil!

    Un grand merci à toi, zipe31, t'assures un max =)

    Sinon, pour ta remarque à propos de "sourcer" mon script, je vais essayer de me renseigner, ca m'a l'air intéressant^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/11/2012, 14h20
  2. [Lazarus] Comment détecter si le programme est lancé avec l'IDE ?
    Par Invité dans le forum Lazarus
    Réponses: 0
    Dernier message: 05/07/2010, 17h30
  3. Comment savoir si le service apache est lancé avec java?
    Par devassam dans le forum Général Java
    Réponses: 3
    Dernier message: 25/08/2008, 18h19
  4. Erreur ORA-12154 si lancé avec Cron
    Par dj_benz dans le forum Connexions aux bases de données
    Réponses: 11
    Dernier message: 30/07/2008, 19h05
  5. Réponses: 18
    Dernier message: 12/06/2006, 09h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo