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

Linux Discussion :

Script bash début


Sujet :

Linux

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 23
    Points : 21
    Points
    21
    Par défaut Script bash début
    Bonjour,
    je suis occupé a réaliser mes premiers scripts Bash
    Soyez donc svp indulgent quand a la repetition de mon code.
    Je bloque sur une fonction qui devra renommer les fichiers s'ils ne sont pas vides
    et ce dans une boucle for.
    voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
            x=1
                    for file in *.avi* ;do
                    if [[ ! -s "$file" ]]; then
                            echo " fichier vide verifier vos sources"
                            exit 1
     
                    elif [[ -s "file" ]]; then
                            mv "$file" /*${file/%[par2][PAR2]/repa}=>substitution de test
                    fi
                    mv $file pearlharbor.$x
                    ((x+=1))
                    done
    Donc pour chaque occurences contenant *.avi.* ,un test est fait pour voir si le fichier est vide,si au moins l' un d'entre eux est vide il quitte , car cela entrenerait un probleme d'avoir un fichier vide pour le reste du script.
    s'il ne l'est pas il continu.
    Je trouve ce code tres sale un niveau des MV et cela me conviens pas .

    Ce que je voudrais est qu'il renomme les fichiers avi en $monchoix.$x
    seulement avi peut avoir plusieur place dans le fichier et pas seulement en suffix :
    exemple => test.avi , test.avi.ancienfichier test.avi.001 etc .....
    j'avais pensé a $(ls -C | grep blablabla) mais j'entend souvent dans les forum que ls n'est pas fait pour le script et est tres deconseillé.
    J'aurais donc besoin d'un peu d'éclaircissement .
    Merci

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pitbac23 Voir le message
    Donc pour chaque occurences contenant *.avi.* ,un test est fait pour voir si le fichier est vide,si au moins l' un d'entre eux est vide il quitte , car cela entrenerait un probleme d'avoir un fichier vide pour le reste du script.
    Pourquoi ne pas l'effacer et continuer ? Ou au pire ne pas le traiter ???
    En tout cas c'est pas cool pour les fichiers suivants. Enfin c'est toi qui voit...

    Citation Envoyé par pitbac23 Voir le message
    j'avais pensé a $(ls -C | grep blablabla) mais j'entend souvent dans les forum que ls n'est pas fait pour le script et est tres deconseillé.
    Ah bon ???
    Ben cela ne se dit pas dans les bons forums peuplés de bons unixiens. Tu peux utiliser dans ton script sans remord toute commande existante (et même créer la tienne si elle n'existe pas).

    Citation Envoyé par pitbac23 Voir le message
    Ce que je voudrais est qu'il renomme les fichiers avi en $monchoix.$x
    seulement avi peut avoir plusieur place dans le fichier et pas seulement en suffix :
    exemple => test.avi , test.avi.ancienfichier test.avi.001 etc .....
    J'aurais donc besoin d'un peu d'éclaircissement .
    Merci
    Bah, je tape ça en live (sans tester) mais ça devrait le faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/bin/sh
    i=1
    ls *avi* |while read file
    do
        if test ! -s "$file"
        then
            echo "$file vide => on le passe"
            continue
        fi
     
        echo "remplace $file par $monchoix.avi.$i"
        mv "$file" "$monchoix.avi.$i"
        i=`expr $i + 1`
    done
    Si le avi peut aussi être en majuscule, remplacer "ls *avi* |while read file" par ls |grep -y avi |while read file

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 23
    Points : 21
    Points
    21
    Par défaut
    Rebonjour,
    Merci de m'avoir répondu avec une telle précision.
    j'ai testé ton code seulement il y a l'air d'avoir un probleme avec read
    il lit son entrée standard mais il bloque
    le code je l'ai un peu modifié le voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
    set -x
    set test
            x=1
                    ls | grep -i *avi* | while read fichier; do
                    if [[ ! -s "$fichier" ]]; then
                            echo "les fichiers vides vont etre effaces"
                            rm -f $fichier                   
                            continue
                    fi
                    mv $fichier $1.$x
                    ((x+=1))
                    done
    le set -x me donne un + a read fichier mais plus rien ensuite.

    Pourquoi ne pas l'effacer et continuer ? Ou au pire ne pas le traiter ???
    En tout cas c'est pas cool pour les fichiers suivants. Enfin c'est toi qui voit...
    l'effacer serait une solution et je l'ai donc retenue.

    Je ne suis pas un foudre de l'anglais mais en lisant cette page que j'ai compris partiellement , j'en ai deduis que ls n'était pas aproprié.
    http://mywiki.wooledge.org/ParsingLs

    Merci

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 23
    Points : 21
    Points
    21
    Par défaut
    Re bonjour,
    alors j'ai trouvé pourquoi cela n'allait pas .
    read n'était pas alimenter ce qui causait son blocage .
    Je me suis dis des lors que cela ne pouvait venir que du ls
    j'ai tester l'expression simple et il ne me retournait aucun fichier.
    je l'ai changé en ERE et ca marche
    je post ci dessus le code qui fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #!/bin/bash
    set -x
    set test
            x=1
                    ls | grep -E '+(avi)' | while read fichier; do
                    if [[ ! -s "$fichier" ]]; then
                            echo "les fichiers vides vont etre effaces"
                            rm -f $fichier                   
                            continue
                    fi
                    mv $fichier $1.$x
                    ((x+=1))
                    done
    Je remercie tout le monde de leur aide et plus particulierement Svear

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pitbac23 Voir le message
    Re bonjour,
    alors j'ai trouvé pourquoi cela n'allait pas .
    read n'était pas alimenter ce qui causait son blocage .
    Ben en fait si le "ls *avi*" ne renvoie rien, ça ne bloque pas mais ça ne rentre pas non plus dans le while quoi...

    Citation Envoyé par pitbac23 Voir le message
    Je ne suis pas un foudre de l'anglais mais en lisant cette page que j'ai compris partiellement , j'en ai deduis que ls n'était pas aproprié.
    http://mywiki.wooledge.org/ParsingLs
    Si on lit mieux, il dit qu'en fait si t'as des caractères bizarre dans tes noms de fichiers le ls renverra autre chose ce qui peut poser souci. Il conseille d'ailleurs de ne jamais faire "for file in `ls`" mais c'est la syntaxe qui est maladroite et non le ls lui-même. Mais c'est du shell extrème quoi...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 23
    Points : 21
    Points
    21
    Par défaut
    salut svear

    c'est exactement ce que j'avais comme probleme avec la boucle for que j'avais precedemment .
    exemple: les fichiers avait comme nom =>Pear extensio.avi Pear extension.avi.1
    il y avait 30 fichiers
    le ls dans la boucle for me rapportait 62 fichiers :-)
    au faite il les interpretait comme
    Pearl
    exentensio.avi
    Pearl
    extension.avi.1
    etc ....
    donc il passait a la ligne sur le separateur espace
    meme avec les guillements "$i" ce passait pas.

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pitbac23 Voir le message
    salut svear

    c'est exactement ce que j'avais comme probleme avec la boucle for que j'avais precedemment .
    exemple: les fichiers avait comme nom =>Pear extensio.avi Pear extension.avi.1
    il y avait 30 fichiers
    le ls dans la boucle for me rapportait 62 fichiers :-)
    Le for sépare ses éléments sur l'espace => d'où le ls |while read => le read sépare ses éléments sur le <return> qui se trouve en fin de ligne

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

Discussions similaires

  1. Requête POST dans un script bash
    Par desperado dans le forum Linux
    Réponses: 4
    Dernier message: 11/12/2007, 22h38
  2. Réponses: 21
    Dernier message: 29/09/2005, 19h33
  3. Script bash : Pb avec sed
    Par fred64 dans le forum Linux
    Réponses: 3
    Dernier message: 19/08/2005, 11h24
  4. Scripts bash : requêtes sql
    Par milka dans le forum Linux
    Réponses: 3
    Dernier message: 17/08/2005, 10h59
  5. Problème script Bash
    Par Sphost dans le forum Linux
    Réponses: 10
    Dernier message: 26/07/2005, 09h56

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