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 totof2000 . Évalué à 3. Dernière modification le 25 juin 2019 à 20:57.
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:
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:
[^] # Re: quelques remarques ..
Posté par totof2000 . É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 :
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 NeoX . Évalué à 2.
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
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
autre solution,
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 à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.