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 :

[script bach] Problème sur la variable de nom de fichier


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Par défaut [script bach] Problème sur la variable de nom de fichier
    Salut,

    Je rencontre un petit soucis avec un script pour trier des fichiers dans différent sous répertoires (je débute en script shell avec quelques connaissances basique de batch):
    Grossomodo je suis dans le dossier /des_files contenant des sous dossier /toto1 toto2...qui eux contiennent des fichier *.ext
    Mais dans ces sous dossier, je ne souhaite garder que 2 types en les copiant dans un autre répertoire avec un nom identique que le dossier parent.
    Les .ext sont différencier par le format *-0.ext et *-1.ext, la devanture du * est composée de numéro et lettre du type Files001AAMJJ-0.ext.
    C'est le seul moyen que j'ai de les différencier.

    En début de script j'avais cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    TYPE=ext
    FILE=*-0
    REP=/home/user/Bureau/des_files
    REP2=/home/user/Bureau/test
    for img in  $REP/$FILE.$TYPE;
    do cp    $FILE.$TYPE $REP $REP2;
    done 
    #if not exist $REP2 ;
    #do
    #mkdir -p /home/user/Bureau/$REP2; 
    #done
    #fi
    Le IF est commenté car déjà la première partie ne fonctionne pas, j'ai en message de retour:
    cp: impossible d'évaluer «*-0.ext»: Aucun fichier ou dossier de ce type
    cp: omission du répertoire «/home/user/Bureau/des_files»
    Le nom aussi est encore non inscrit, je ne sais pas trop comment formuler cela :/

    Merci

  2. #2
    Membre expérimenté Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Par défaut
    Je verrais plutôt comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TYPE=ext
    FILE=*-0
    REP=/home/user/Bureau/des_files
    REP2=/home/user/Bureau/test
    for img in  $REP/$FILE.$TYPE;
    do cp    $img $REP/ $REP2/
    done
    La ligne 6 est corrigée car c'est '$img' qui prend la valeur du nom de fichier et il ne faut pas oublier le slash à la fin du nom de dossier de destination, sinon cp prendra ça pour un nom de fichier !
    D'autre part, la commande mkdir -p ne nécessite pas de vérifier si le répertoire existe.

  3. #3
    Membre confirmé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Par défaut
    Merci de ta réponse,

    Alors j'ai intégré le changement de base par rapport a ce que tu m'as fournit
    J'ai vu je n'ai pas très bien préciser pour quel partie 'avais le retour:

    cp: impossible d'évaluer «*-0.ext»: Aucun fichier ou dossier de ce type
    cp: omission du répertoire «/home/user/Bureau/des_files

    Il s'agit de la première partie, le cp. Même avec la modification apporté j'ai le même retour.
    Je pense qu'il n'arrive pas a le trouvé car il ne cherche pas dans les sous répertoires. Comment faire cela ? y intégrer un cd de chaque sous répertoires ? (il y en a plus de 60)

    pour le mkdir, quel moyen puis je utiliser pour qu'il prenne le nom du dossier qui contient le fichier.
    Par exemple il est dans /Bureau/des_files/Log_des1. Le nom que je souhaites que le dossier prenne est le /Log_des1, le dossier crée a partir du fichier du sous répertoire suivant /Bureau/des_files/Log_des2 ainsi de suite...

  4. #4
    Membre expérimenté Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Par défaut
    Ce serait déjà bien d'essayer comme ça (et ça simplifie)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cd /home/user/Bureau/des_files
    for img in *-0.ext; do
    echo $img    # pour voir ce que ça donne
    #   cp $img /home/user/Bureau/test/
    done

  5. #5
    Membre confirmé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Par défaut
    Citation Envoyé par fransoo Voir le message
    Ce serait déjà bien d'essayer comme ça (et ça simplifie)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cd /home/user/Bureau/des_files
    for img in *-0.ext; do
    echo $img    # pour voir ce que ça donne
    #   cp $img /home/user/Bureau/test/
    done
    Le retour du echo est bon pour moi, le soucis se poses sur passé dans tout les sous répertoires
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    aerane@aerane-GX723:~/Bureau$ ./test.sh
    *-0.jpg

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 290
    Par défaut
    Bonjour,

    La fonctionnalité que vous recherchez vous sera donné par find, qui fera une recherche récursive dans vos sous répertoire. Passez le résultat dans xargs pour jouer votre commande. Tout se fait alors en une ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TYPE=ext
    FILE=*-0
    REP=/home/user/Bureau/des_files
    REP2=/home/user/Bureau/test
     
    # Je préfere tester REP2 ici
    [[ -d $REP2 ]] || mkdir -p $REP2
     
    find $REP -name "$FILE.$TYPE" -print0 | xargs -0 -I % cp % $REP2
    Le puriste de find diront peut-être qu'il faut utiliser -exec. Je préfère xargs personnellement .

    Pour plus de précision sur les commandes utilisées, ce sera mieux pour vous d'aller voir les man.

    PS : dans votre code commenté, vous testez l'existence répertoire REP2 pour le recréer. Vous devriez le faire avant la copie, sinon je vous laisse imaginé quel problème vous allez avoir.

  7. #7
    Membre confirmé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Par défaut
    La commande arrive bien a aller dans mes sous répertoires ducoup tout va bien avec le find, le soucis est que je souhaite copier, ou plustot crée dans le répertoire de destination, le sous répertoire avec le même intitulé d'origine.

    Un exemple sera plus parlant j'espère:

    Le script est placé dans un répertoir /file, en l'executant, il me copie les fichiers en extention *-0.ext et *-1.ext contenu dans les sous dossier /file_type1 /file_type2.
    Malheureusement ces sous répertoires contiennent d'autres fichiers que je ne souhaite pas (d'où le find).
    Les fichiers *-0.ext et *-1.ext devront être copier dans leurs sous dossier respectif, d'où ils proviennent. Les *-0.ext et *-1 de /file_type1 et les *-0.ext et *-1 de /file_type2, avec le même nom de sous dossier

    Ma question, y a t'il une commande qui prend en compte le nom du sous répertoire parent, ou il vaudrait mieux y inclure une variable avec le nom du sous dossier ?

    Ou n'est il pas plus judicieux de copier le repertoire complet et d'y supprimer les fichier qui ne contiennent pas de fin en -0. et -1. La dessus je n'ai pas trouvé de complement au RM pour "ne pas" supprimer les fichiers contenant cette chaine de caractère dans le nom.

    Cela pourrai donné un genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find $REP -name not "$FILE0.$TYPE" -print0 | xargs -0 -I % rm%$TYPE
    Je sais que mon "not" est une erreure ici mais c'est pour donner une idée de la chose.

  8. #8
    Membre expérimenté Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Par défaut
    Citation Envoyé par aerane Voir le message
    Les fichiers *-0.ext et *-1.ext devront être copier dans leurs sous dossier respectif, d'où ils proviennent. Les *-0.ext et *-1 de /file_type1 et les *-0.ext et *-1 de /file_type2, avec le même nom de sous dossier
    Là je crois que je n'ai pas compris, je pense qu'un exemple avant/après serait plus parlant (je ne comprenais déjà pas très bien au premier post mais là ça se confirme). Je pense qu'il serait judicieux d'éclairer notre lanterne.

  9. #9
    Membre confirmé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Par défaut
    Désoler je suis parti un peu loin dans mes refléxions

    Je viens après avoir retourner la chose en tout sens, d'ajouté une simple étape intermedaire qui devrai résoudre mon soucis.

    L'idée est elle bonne a votre avis ?

    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
     
    FILE0=*-0.ext
    FILE1=*-1.ext
    REP1=/home/user/Bureau/des_files
    REP2=/home/user/Bureau/test
    TMP=/home/user/Bureau/TMP
     cd /$REP1
      for REP in $(ls)
     do
     cp -p $REP/$FILE0 $TMP
    cp -p $REP/$FILE1 $TMP
    rm * $REP
    cp -p $TMP/$FILE0 $REP1
    cp -p $TMP/$FILE1 $REP2
    rm * $TMP
    done

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 636
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 636
    Par défaut
    Bonjour,

    on n'utilise pas ls dans un script,
    et
    on n'utilise pas une boucle for pour lire la sortie d'une commande.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. Problème sur la variable IE <aucune variable>
    Par licwimi dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 16/10/2012, 21h41
  2. Problème sur des variables.
    Par Conjugue dans le forum Débuter
    Réponses: 4
    Dernier message: 17/03/2012, 18h50
  3. [PHP 5.2] Problème sur les Variables Variables
    Par bpdelavega dans le forum Langage
    Réponses: 17
    Dernier message: 14/01/2011, 17h10
  4. exécuter script/bach/commande sur machine distante
    Par bossun dans le forum VBScript
    Réponses: 1
    Dernier message: 20/01/2009, 18h24
  5. Problème sur les variables de class
    Par nico_pouchet dans le forum VB.NET
    Réponses: 6
    Dernier message: 11/06/2007, 16h51

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