Forum Programmation.shell Sélectionner une liste de fichiers à traiter

Posté par . Licence CC by-sa.
Tags : aucun
0
25
juin
2019

Bonjour,

Je cherche à sélectionner une liste de fichiers d'un répertoire définit.

#!/bin/bash

REPTEMPORAIRE=/home/user/distrib
FICHIERTEMP=/tmp/temp
FICHIERLIST=/tmp/list
REPCIBLE=/home/user/Documents

# Affichage et enregistrement des fichiers présents dans le répertoire cible
for i in $(ls $REPCIBLE)
do
    fichier=$REPCIBLE/$i

    if [ -f $fichier ]; then
        count=$(($count+1))
        if [ $count = 1 ]; then
            list=$i
            echo $count"-)" $i
        fi
        if ! [ $count = 1 ]; then
            list=$i,$list
            echo $count"-)" $i
        fi
    fi
done

La première partie est pour moi bonne mais probablement pas optimisée, j'assigne à la variable list le nom des fichiers dans l'ordre, et je les affiche avec un numéro.

# Sélection des fichiers à copier
echo ''
read -p 'Quels documents voulez vous copier ? ' documents
echo $documents > $FICHIERTEMP
cat $FICHIERTEMP | tr ',' '\r' > $FICHIERLIST


# copie des fichiers voulus
for i in $(wc -l $FICHIERLIST)
do
    tete=$(head -n $i $FICHIERLIST)
    cut -d , -f $tete $LIST > /tmp/choix
    choix=$(cat /tmp/choix )
    echo "Copie de " $choix
    cp $$REPCIBLE/$choix $REPTEMPORAIRE/
    #head -n $i $FICHIERLIST | cut -d, -f- $LIST | cp $repcible/- $REPTEMPORAIRE/ : commande d'origine que j'ai ensuité séparé au dessus car elle ne fonctionne pas.
done

#rm -r $FICHIERLIST $FICHIERTEMP $REPTEMPORAIRE

Mon soucis est dans cette seconde partie, je lis les documents à copier, que je mets dans une variable. Les nombres sont séparés par une virgule.
Je voulais utiliser cette liste pour sélectionner les fichiers puis les copier, mais je n'arrive pas à faire fonctionner.
Auriez-vous une proposition permettant d'arriver à ms fins ?

Merci de m'avoir vu, j'espère que la lecture de ce post n'a pas trop piqué les yeux…

  • # quelques remarques ..

    Posté par . Évalué à 3. Dernière modification le 25/06/19 à 20:57.

    cat $FICHIERTEMP | tr ',' '\r' > $FICHIERLIST

    1./ UUOC.
    2. il me semble qu'un retour chariot sous Unix ne soit pas \r mais \n
    3. Si tu fais ça pour compter le nombre de lignes, sache que wc peut compter également le nombre de mots (wc -w il me semble).
    4/ La commande for s'utilise sur une liste : for i in $FICHIERLIST t'initialisera la variable i avec le nom du fichier a chaque itération:

    $ var="a b c"
    $ for i in $var
    > do
    > echo "$i"
    > done
    a
    b
    c

    Cerise sur le gateau, tu peux spécifier le séparateur de champ, donc pas besoin de tambouille pour transformer la virgule en saut de ligne:

    $ OLDIFS=$IFS
    $ IFS=','
    $ var2="a,b,c"                                                                        
    $ for i in $var2                                                                     
    > do
    > echo "$i"
    > done
    a
    b
    c
    $ OLDIFS=$IFS
    
    ``̀
    
    Voilà, j'espère que ça t'aidera.
    • [^] # Re: quelques remarques ..

      Posté par . Évalué à 3.

      En fait je viens de voir en relisant ton code que tu te compliques la vie. Tu pourrais juste créer ta liste de fichier en faisant systématiquement dans ta boucle :

      list="$i "

      puis itérer ton for sur $list,
      plutot que de différencier le traitement de la première itération lorsque tu génères ta liste.

  • # des pistes de simplifications

    Posté par . Évalué à 2.

    echo $documents > $FICHIERTEMP

    ca va ecraser le contenu de $FICHIERTEMP
    la personne va repondre par le numero du fichier ?
    donc pourquoi alors relire le contenu pour remplacer les , par des \n

    comme dit plus haut,
    sauvegarde l'ancien separateur OIFS=$IFS
    remplace le par la virgule le temps de ton traitement IFS=','

    tu peux alors faire un

    for i in $documents
    do
      echo $i
    done

    qui va alors te lister les numeros selectionnés
    à toi ensuite de les trouver dans la liste des fichiers, puis de prendre la 2e colonnes

    j'imagigne que la liste se presente sous la forme

    1 premier_fichier.txt
    2 dexueme_fichier.pdf
    3 encore_un_fichier.doc

    autre solution,

    maliste=REP/*
    
    for i in $(seq 0 $maliste{#})
    do
      echo "N° "$i" -> fichier : "${maliste[$i]}
    done
    
    ...

    puis plus loin vu que la liste est deja constituée,
    tu dois pouvois rappeler
    ${maliste[$x]} avec x etant chacun des choix de l'utilisateur

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.