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 :

[bash] capturer seulement le premier élément renvoyé par "ls"


Sujet :

Linux

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 60
    Points : 79
    Points
    79
    Par défaut [bash] capturer seulement le premier élément renvoyé par "ls"
    Bonjour à tous,

    je me trouve confronté depuis un petit bout de temp face à un problème, pour lequel je n'arrive pas à trouver de solutions ...

    Je possède un dossier qui contient plusieurs sous dossiers.
    Et dans dans chaque sous dossier, il y a un nombre variable de fichiers.

    A partir de là, j'aimerais pouvoir copier seulement UN SEUL des fichiers dans un dossier cible, et ce, pour chaque sous-dossier.

    Je commence à peine à me mettre au shell par nécessité, et je rencontre déjà pleins de problèmes... Mais chaque chose en son temps...

    J'espère que j'ai été clair dans l'explication de mon problème.
    Voilà le code que j'ai commencé à écrire


    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
     
    cd ~/Personnel/TEST/GROS_DOSSIER/
    for doss in `ls`
    do
    	if [ -d $doss ]
    	then
    		cd $doss;
    		tmp=`ls -1`;
    		cp $tmp ~/Personnel/TEST/Modif/DB;
    		cd ..
    	fi
    done
    Mais ce programme déplace tous les éléments contenus dans les sous-dossiers de GROS_DOSSIER, laors que je veux seulement qu'il déplace un seul élément de chaque sous-dossier, quelque soit cet élément (idéalement pris au hasard, mais peu importe pour l'instant)

    Merci de m'aider...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 594
    Points : 19 473
    Points
    19 473
    Par défaut
    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
    
    bigDir="~/Personnel/TEST/GROS_DOSSIER"
    for dir in $bigDir/*; do
       cpt=0
       if [ -d $dir ]; then
          for file in $dir/*; do
              if [ $cpt -lt 1 ]; then
           echo "cp $file ~/personnel/TEST/Modif/DB"
                 ((cpt++))
              fi
          done
       fi
    done
    c'est ça ?

  3. #3
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Autrement pour prende le premier avec l'algo de n_bah tu peux utiliser head -1 et te passer du compteur cpt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    file=`ls -1 $dir/* | head -1`
    cp $file ~/personnel/TEST/Modif/DB"
    Ici un autre exemple un peu plus compliqué qui génère une arborescence (avec un peu d'aléatoire) et qui prend un fichier au hasard dans chaque sous repertoire (si non vide)
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    #!/bin/bash
    unalias ls
    stamp=`date "+%H%M%S"`
    debug=1
    indir=test_$stamp
    outdir=dest_$stamp
     
    mkdir -p $outdir
     
    ## Partie 1: Generation d'une arborescence
    echo "Generation des données de tests"
    for i in `seq 1 10`;
    do
        [ $debug -eq 1 ] && echo "Creation de $indir/test_$i"
        mkdir -p $indir/test_$i
        for j in $(seq  1 `expr $RANDOM % 25`);
        do
    	[ $debug -eq 1 ] && echo "Creation du fichier $indir/test_$i/fichier_${stamp}_${i}_${j}.fic"
    	echo "$i $j" > $indir/test_$i/fichier_${stamp}_${i}_${j}.fic
        done
        echo "$i invalid"  > $indir/test_$i.invalid
    done    
     
    ## Generation de la liste des sous-repertoires
    directory_list=`ls -1F $indir | egrep -e '/$'`
     
    ## Partie 2: prendre un fichier au hasard dans chaque sous repertoire.
    for directory in $directory_list
    do
        ## Recuperation de la liste des fichier de chaque sous-repertoire
        file_list=( `ls -1 $indir/${directory}/` )
        ## Determination du fichier a prendre. 
        file_to_take=`expr $RANDOM % ${#file_list[@]}`
        echo "Copie du fichier ${file_list[$file_to_take]}"
        cp   $indir/${directory}/${file_list[$file_to_take]} $outdir
    done
     
    ## finalement on regarde ce qui a été pris
    ls -lrt $outdir

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 60
    Points : 79
    Points
    79
    Par défaut
    Merci de vos réponses à tous mes deux.

    Le choix de 'head -1' est intéressant, c'est celui que j'ai choisi...
    En plus, c'est exactement ce que je veux. Merci beaucoup pour ton programme jabounet, parce que en fait ce qui m'interessait c'était de pouvoir prendre un élément au hasard dans chaque dossier.
    Comme ca c'est parfait !!

    Vraiment génial ce forum !!

  5. #5
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Aucun souci, ravit de t'avoir aider

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/08/2011, 13h06
  2. [LG]résultat renvoyé par une fonction
    Par le 27 dans le forum Langage
    Réponses: 3
    Dernier message: 10/12/2003, 10h31
  3. Sélectionner tous les id renvoyés par une 1ère requête
    Par Prof Vince dans le forum Requêtes
    Réponses: 5
    Dernier message: 29/11/2003, 19h46
  4. Réponses: 2
    Dernier message: 16/10/2003, 17h17
  5. Traitement d'un char* renvoyé par une DLL en C++
    Par LuluTchab dans le forum Langage
    Réponses: 4
    Dernier message: 22/03/2003, 21h48

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