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

Shell et commandes GNU Discussion :

[BASH] boucle for sur des fichiers, recuperation du chemin ?


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    489
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 489
    Points : 388
    Points
    388
    Par défaut [BASH] boucle for sur des fichiers, recuperation du chemin ?
    Bonjour,

    je suis loin de m'y connaitre en scripts bash.. et je suis en train d'essayer d'en faire un.. qui me pose quelques soucis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash -x
    for i in $( ls /var/www/voyagemotion/media_temp/* -R )
      do
      if [ -d "$i" ]
          then
    	      echo $i
      else
        mencoder $i -forceidx -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -of lavf  -oac mp3lame -lameopts abr:br=56 -srate 22050 -ovc lavc -l\
    avcopts vcodec=flv:vbitrate=250:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf scale=320:240 -o $i.flv
      fi
    done
    Le probleme est que ma variable $i ne contient que le nom du fichier, et pas son chemin complet.. Donc mencoder me sort une erreur.. il ne trouve pas le fichier !

    Comment faire ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    489
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 489
    Points : 388
    Points
    388
    Par défaut
    bon, j'ai modifié comme ca, ca a l'air de marcher :

    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
    #!/bin/bash -x
     
    for i in `find /var/www/voyagemotion/media_temp/ -name '*'`
      do
     
      echo $i
      ls $i
     
      if [ -d "$i" ]
          then
          echo $i
      else
     
        mencoder $i -forceidx -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -of lavf  -oac mp3lame -lameopts abr:br=56 -srate 22050 -ovc lavc -l\
    avcopts vcodec=flv:vbitrate=250:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf scale=320:240 -o $i.flv
     
      fi
     
    done
    Si vous avez des commentaires.. j'ai lu que le for et le find n'etaient pas vraiment a utiliser ensemble ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    489
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 489
    Points : 388
    Points
    388
    Par défaut
    j'ai un autre probleme..

    la structure du dossier est ainsi :

    /var/www/voyagemotion/media_temp/{$USER_ID}/{$FILENAME}

    Comment recuperer la valeur du USER_ID ? donc le nom du dossier.. ?

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 813
    Points
    30 813
    Par défaut
    Utilise basename et dirname :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    basename $(dirname "/var/www/voyagemotion/media_temp/USER_ID/FILENAME") -> USER_ID
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    489
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 489
    Points : 388
    Points
    388
    Par défaut
    merci pour cette reponse.. je peux te demander de detailler un peu.. comment je recupere mon USER_ID ?

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 813
    Points
    30 813
    Par défaut
    Comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var=$(basename $(dirname "/var/www/voyagemotion/media_temp/USER_ID/FILENAME"))
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    489
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 489
    Points : 388
    Points
    388
    Par défaut
    wow.. merci beaucoup.. meme si je ne comprends pas tres bien le fonctionnement, ca marche...

    Derniere question.. je vais appeller ce script bash depuis un script php.. Comment savoir que le script bash s'est bien executé et sans erreur ?

  8. #8
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Citation Envoyé par zevince Voir le message
    wow.. merci beaucoup.. meme si je ne comprends pas tres bien le fonctionnement, ca marche...
    Tu connais la commande "man" ?

    Citation Envoyé par zevince Voir le message
    Derniere question.. je vais appeller ce script bash depuis un script php.. Comment savoir que le script bash s'est bien executé et sans erreur ?
    Dans ton script : avec exit ; dans le code php : en vérifiant le code de retour.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    489
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 489
    Points : 388
    Points
    388
    Par défaut
    oui mais lire tout le man de bash.. j'ai pas vraiment le temps..

    ok je vais me renseigner sur le exit

  10. #10
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Basename et dirname ne font pas partie de Bash.

    S'il y a quelque chose dans la syntaxe que tu ne comprends pas, tu peux demander.

    Le "exit" est en effet dans le man de bash. Fort heureusement, le man possède une fonction de recherche.

  11. #11
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Citation Envoyé par zevince Voir le message
    oui mais lire tout le man de bash.. j'ai pas vraiment le temps..

    ok je vais me renseigner sur le exit

    Tu es un peu gonflé, il ne s'agit pas de parcourir tout le man
    Al1 24 t'a communiqué la solution et le seul effort que tu doit produire est de taper :

    man dirname et man basename


    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
    DIRNAME(1)                       User Commands                      DIRNAME(1)
    
    NAME
           dirname - strip non-directory suffix from file name
    
    SYNOPSIS
           dirname NAME
           dirname OPTION
    
    DESCRIPTION
           Print  NAME with its trailing /component removed; if NAME contains no /'s, out-
           put `.' (meaning the current directory).
    
           --help display this help and exit
    
           --version
                  output version information and exit
    
    EXAMPLES
           dirname /usr/bin/sort
                  Output "/usr/bin".
           dirname stdio.h
                  Output ".".
    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
    BASENAME(1)                      User Commands                     BASENAME(1)
    
    NAME
           basename - strip directory and suffix from filenames
    
    SYNOPSIS
           basename NAME [SUFFIX]
           basename OPTION
    
    DESCRIPTION
           Print  NAME  with any leading directory components removed.  If specified, also
           remove a trailing SUFFIX.
    
           --help display this help and exit
    
           --version
                  output version information and exit
    
    EXAMPLES
           basename /usr/bin/sort
                  Output "sort".
           basename include/stdio.h .h
                  Output "stdio".
    Loi de Murphy:
    La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
    La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
    Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    489
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 489
    Points : 388
    Points
    388
    Par défaut
    ok, bah je croyais que c'etait dans le man de bash, tu sais, c'est le principe d'un forum, d'apprendre des choses aux autres.. sur le forum php, je reponds parfois a des messages surprenants.. bon, et ?

    Merci a tous pour vos aides, je croyais que basename retournait le nom d'un fichier et pas le dossier, voila tout !

  13. #13
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Bien sûr. C'est justement pour t'aider qu'on t'a dit de lire le man et qu'on t'a expliqué où c'était (mais ça, t'aurais pu le trouver tout seul).

    Pour savoir si une commande est une builtin du shell ou un binaire externe, tu peux utiliser "type" (ou "which" ou "where", selon le shell). Tu sauras ainsi s'il faut chercher dans "man bash" ou dans un autre man.

    Cela dit, ça prend 10 secondes pour se rendre compte que le manuel de bash ne parle pas de basename.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    489
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 489
    Points : 388
    Points
    388
    Par défaut
    Certes certes...

    bah de toute facon, j'ai changé de methode, je fais tous ces traitements en php, et je ne fais qu'appeller mencoder avec exec... Surtout qu'une fois que le traitement est fait j'ai besoin de mettre ma base de donnée a jour et d'envoyer un mail a la personne qui a posté la video pour l'informer que c'est publié... plus simple pour moi pour recuperer les chemins, etc..

    Mais ca m'a appris des choses quand meme.. merci, resolu

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

Discussions similaires

  1. [CS3] Faire une boucle for sur des champs texte
    Par Bubuk dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 18/12/2013, 17h06
  2. Boucle for sur des Slides
    Par nsr88 dans le forum VBA PowerPoint
    Réponses: 3
    Dernier message: 07/11/2013, 14h36
  3. Syntaxe pour une boucle for sur des combobox
    Par Tifriis dans le forum VBA Access
    Réponses: 3
    Dernier message: 20/10/2010, 13h52
  4. boucle for each sur des fichiers
    Par Nako_lito dans le forum VBA Access
    Réponses: 2
    Dernier message: 02/08/2010, 14h21
  5. [Eval] Problème de boucle for sur des tableaux
    Par battle_benny dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/01/2006, 23h55

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