Merger 2 fichiers / script sh

Résolu
snow_frog Messages postés 214 Date d'inscription   Statut Membre Dernière intervention   -  
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

voilà mon problème: un petit script sh qui demande à l'utilisateur (par le biais de zenity) sur quels fichiers je veux lancer un traitement / recuperation d'image


#!/bin/sh

find * -type d > tmp1

LIST_REP='sed -e 's/.*/"" &/' tmp1'

zenity --list --title "selection" --text "repertoire contenant les images" --checklist --column "selection" --column "repertoire" $LIST_REP > repertoire

SELECT='sed -e 's/|/\n/g' repertoire'

for i in $SELECT
do
find $i/*.png -printf "%f\n" > tmp3
LIST_PNG='sed -e 's/.*/"" &/' tmp3'
zenity --list --title "selection" --text "selection image a traiter" --checklist --column "selection" --column "images" $LIST_PNG >> image

done


...voilà où j'en suis.

mon problème est que je me retrouve avec un fichier "repertoire" contenant ma selection de repertoire et u fichier "image" conteant ma selection d'image

là où je bugue, c'est pour lier les 2 ensemble afin d'avoir le repertoire associé aux images

 frog> cat repertoire
2013_09_25|2013_09_26
frog> cat image
img_20130925_12h00.png|img_20130925_14h00.png|img_20130925_16h00.png
img_20130926_11h00.png|img_20130926_16h00.png
frog>


je voudrais obtenir à partir de ces deux fichiers ça:


frog> cat chemin
2013_09_25/img_20130925_12h00.png
2013_09_25/img_20130925_14h00.png
2013_09_25/img_20130925_16h00.png
2013_09_26/img_20130926_11h00.png
2013_09_26/img_20130926_16h00.png
frog>


j'ai bien trouvé la commande paste, mais...
frog> paste -d '/' repertoire image > chemin 
frog> cat chemin
2013_09_25/img_20130925_12h00.png|img_20130925_14h00.png|img_20130925_16h00.png
2013_09_26/img_20130926_11h00.png|img_20130926_16h00.png

ça copie bien comme il faut, mais il faudrait une ligne par image avec son chemin

avez-vous une idée pour obtenir ça ?
et merci d'avoir lu jusqu'au bout :)
d'avance merci à la communauté

4 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Ça m'a l'air très compliqué, supposons que 2013_09_25 et 2013_09_26 soit dans le même répertoire (mettons /home/toto/photos), il suffit de faire un
    find /home/toto
    pour avoir le résultat souhaité.

    Sinon, le plus simple c'est d'utiliser et à chaque ligne rencontrée, en utilisant le séparateur de colonne "|" extraire le 1er élement (le répertoire) et itérer sur les éléments suivants pour les concaténer avec celui-ci. Le script serait écrit non pas en shell mais en awk, qui est plus adapté pour ce que tu veux faire.

    Bonne chance
    0
  2. snow_frog Messages postés 214 Date d'inscription   Statut Membre Dernière intervention   139
     
    merci de ta réponse,

    même si je ne suis pas sûr d'avoir tout compris

    première étape, "j'éclate" mon fichier "repertoire" --> un repertoire par ligne
     sed -e 's/|/\n/g' repertoire > repertoire_ligne
    frog> cat repertoire
    2013_09_25|2013_09_26
    frog> cat repertoire_ligne
    2013_09_25
    2013_09_26


    ensuite il faudrait que l'imprime la ligne 1 du fichier repertoire_ligne, avec chaque champ de la ligne 1 du fichier image
    ==> c'est ça que je ne vois pas comment faire.

    sinon, j'ai trouvé un contournement (qui ne me plait pas trop, mais bon si je n'ai pas le choix je le garderai...:
    dans la selectio ndes fichiers sous zenity, au lieu d'afficher que le nom de fichier j'affiche le chemin

    avant:
    find $i/*.png -printf "%f\n" > tmp3


    contournement:
    find $i/*.png -printf "%h/%f\n" > tmp3
    0
  3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    find $i/*.png -printf "%f\n" > tmp3

    Pourquoi supprimes-tu le chemin là, puisque tu t'évertues à vouloir le remettre ensuite ?
    0
  4. snow_frog Messages postés 214 Date d'inscription   Statut Membre Dernière intervention   139
     
    Salut,

    je le supprime pour ne pas qu'il apparaise dans la boite de dialogue de selection de fichier pour plus de lisiblité à l'écran

    j'ai essayé sous zenity de "l'afficher" mais de cacher la colonne correspondante, mais du coup il n'est pas dans la sortie zenity...
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      A ce moment là, mieux vaut récupérer la liste avec les chemins complets dans un fichier, construire un second fichier pour l'affichage dans zenity (avec numéro) et en fonction du numéro choisi (et non pas du nom) afficher le numéro de ligne correspondant...

      Le fichier avec chemin+nom :
      $ cat chemin 
      2013_09_25/img_20130925_12h00.png
      2013_09_25/img_20130925_14h00.png
      2013_09_25/img_20130925_16h00.png
      2013_09_26/img_20130926_11h00.png
      2013_09_26/img_20130926_16h00.png

      Le fichier à construire avec numéro+nom :
      $ nl < <(sed 's#.*/##' chemin)
      1 img_20130925_12h00.png
      2 img_20130925_14h00.png
      3 img_20130925_16h00.png
      4 img_20130926_11h00.png
      5 img_20130926_16h00.png

      La ligne a récupéré en fonction de son numéro :
      $ sed -n 2p chemin 
      2013_09_25/img_20130925_14h00.png
      0