Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 01/02/2015, à 11:57

tifil

Question suppression / copie fichier

Bonjour,

Je viens vous poser une petite question.

J'ai écrit un petit programme qui liste les fichiers du répertoire courant, mais qui ajoute un numéro devant chaque fichiers, voici mon code:

pwd= « $chemin »
echo $chemin
 
j=1
for i in *
do
echo « $j)$i »
j=$((j+1))
done

Maintenant, je souhaite, écrire un programme avec diverses fonctions, dont une qui supprime un fichier. Une fois listé, j'écrit le numéro du fichier que je souhaite effacer, et ensuite il supprime celui-ci. Mais quand j'éxécute mon code, il ne le supprime pas, voici mon code:

pwd= « $chemin »
echo $chemin
 
j=1
for i in *
do
echo « $j)$i »
j=$((j+1))
done
 
function supprimerFichier
{
echo "quel fichier ?"
read j
rm -f $j
echo "fichier delete"
}
 
echo " 2- supprimer un fichier"
read choix
 
case "$choix" in
2) supprimerFichier;;
 
esac

Si dans mon rm, je met par exemple $fichier, et qu'ensuite une fois éxécuté, je lui indique directement le nom du fichier à supprimé, par exemple, test.txt, là ça fonctionne, mais quand je souhaite récupérer la variable j qui contient le numéro, ça ne fonctionne pas.

C'est plus simple, de mettre directement le numéro que de mettre le nom du fichier. C'est mieux de passer en paramètre le numéro du fichier que son nom.

J'ai vu qu'on pouvait utiliser un tableau, mais je ne sais pas comment récupérer dans un tableau la variable "j" qui contient le numéro, puis comment l'exploiter par la suite ?


Merci d'avance.

Dernière modification par tifil (Le 01/02/2015, à 19:04)

Hors ligne

#2 Le 01/02/2015, à 12:50

erresse

Re : Question suppression / copie fichier

Bonjour,
Il est normal que ça ne fonctionne pas, puisque ce que tu veux supprimer (rm -f $j) n'existe pas. Dans ton arborescence, aucun fichier ne s'appelle 1 2 ou 3, ce n'est qu'un numéro de rang arbitraire que tu as associé à un nom de fichier. Pour supprimer le fichier, il faudrait que tu recherches quel fichier correspond au numéro que tu saisis dans ta fonction SupprimerFichier, et que tu passes ce nom à ta commande rm...


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#3 Le 01/02/2015, à 13:17

pingouinux

Re : Question suppression / copie fichier

Bonjour,
Pour créer un tableau avec le nom des fichiers du répertoire courant

t=(*)

Pour les afficher avec un numéro d'ordre commençant à 1 (voir man nl)

for i in "${t[@]}"; do echo "$i";done | nl

Les indices du tableau commençant à 0, pour supprimer le fichier n° j dans la liste

rm "${t[$((j-1))]}"

Hors ligne

#4 Le 01/02/2015, à 14:29

tifil

Re : Question suppression / copie fichier

Le for, je le met dans ma fonction lister ou bien supprimer ?
La ligne t=(*), je l'ai mise dans ma fonction lister, juste après j=$((j+1)), est-ce correct ?

Hors ligne

#5 Le 01/02/2015, à 14:38

pingouinux

Re : Question suppression / copie fichier

En reprenant ton script, il suffit de faire ceci

pwd= « $chemin »
echo $chemin

t=(*)
for i in "${t[@]}"; do echo "$i";done | nl
 
function supprimerFichier
{
echo "quel fichier ?"
read j
rm "${t[$((j-1))]}"
echo "fichier delete"
}
 
echo " 2- supprimer un fichier"
read choix
 
case "$choix" in
   2) supprimerFichier;;
esac

Remarque : Pour juste avoir la liste numérotée des fichiers

ls | nl

Hors ligne

#6 Le 01/02/2015, à 15:11

tifil

Re : Question suppression / copie fichier

Oui mais dans ma fonction lister, ça affichait un numéro devant chaque fichiers quand je liste.
Avec ton code, quand je rentre un numéro, ça supprime bien le fichier, mais je n'ai pas l'affichage du numéro quand je liste, alors j'ai créer une fonction "lister2", et dedans j'ai mis ça:

function lister2
{
t=(*)
for i in "${t[@]}"
do echo "$j)$i"
j=$((j+1))
done 

J'ai rajouter, dans le echo, "$j)$i)", et le "j=$((j+1)), et je n'ai pas mis le nl, car il me dit une erreur d'entrée / sortie.
Mais avec mes modifs, quand je rentre le numéro, ça ne supprime plus le fichier.

Hors ligne

#7 Le 01/02/2015, à 15:20

pingouinux

Re : Question suppression / copie fichier

tifil #6 a écrit :

et je n'ai pas mis le nl, car il me dit une erreur d'entrée / sortie.

nl est dans le paquet coreutils (main)
Peux-tu montrer la commande exacte que tu as lancée, et le message d'erreur (copier-coller) ?

Hors ligne

#8 Le 01/02/2015, à 16:38

tifil

Re : Question suppression / copie fichier

Je lance la commande:

./script.bash

Hors ligne

#9 Le 01/02/2015, à 16:53

pingouinux

Re : Question suppression / copie fichier

C'est bien, mais ça ne montre ni le message d'erreur, ni la commande utilisant nl qui en est la cause…

Hors ligne

#10 Le 01/02/2015, à 17:01

tifil

Re : Question suppression / copie fichier

Oups, pardon.
J'ai mis le nl dans cette commande comme indiqué avant: 

function lister2
{
t=(*)
for i in "${t[@]}"
do echo "$j)$i"
j=$((j+1))
done |  nl
}

Voici l'erreur que j'ai:

./script15.bash: ligne20: /usr/bin/nl : Erreur d'entrée /sortie


Et comment installer ce paquet ?

Dernière modification par tifil (Le 01/02/2015, à 17:01)

Hors ligne

#11 Le 01/02/2015, à 17:11

pingouinux

Re : Question suppression / copie fichier

Je ne reproduis pas cette erreur. Si nl n'était pas connu, on aurait un autre message. Quel est le script complet ?

Hors ligne

#12 Le 01/02/2015, à 17:20

tifil

Re : Question suppression / copie fichier

Voici mon code:

#! /bin/bash

function lister
{
t=(*)
for i in "${t[@]}" 
do echo "$i"
done | nl
}
 
function supprimerFichier
{
echo "quel fichier ?"
read j
rm "${t[$((j-1))]}"
echo "fichier delete"
}

echo "1 - lister les fichiers" 
echo " 2- supprimer un fichier"
read choix
 
case "$choix" in
1) lister;;
   2) supprimerFichier;;
esac

Je suis actuellement sur une distrib nommée: Live raizo, mais je viens d'essayer ce code sur un ubuntu, et je n'ai pas l'erreur du nl, ça supprime correctement.

Dernière modification par tifil (Le 01/02/2015, à 17:33)

Hors ligne

#13 Le 01/02/2015, à 17:33

pingouinux

Re : Question suppression / copie fichier

Je ne reproduis pas l'erreur que tu indiques en #10.
Ceci fonctionne-t-il ?

ls | nl

Et ceci ?

ls | /usr/bin/nl

Et pendant qu'on y est

type nl
tifil #6 a écrit :

Mais avec mes modifs, quand je rentre le numéro, ça ne supprime plus le fichier.

C'est parce que le tableau t ne se remplit que lorsque tu appelles lister.
Il faudrait que le script se termine ainsi

case "$choix" in
   1) lister;;
   2) lister; supprimerFichier;;
esac

Hors ligne

#14 Le 01/02/2015, à 18:05

tifil

Re : Question suppression / copie fichier

Que ce soit la ligne ls | nl, ou bien une des 2 autres, je les mets juste après le done ?
Si oui, j'ai mis ls | nl juste après le done, et il m'affiche cette erreur:

erreur de syntaxe près du symbole inattendu "ls".

Hors ligne

#15 Le 01/02/2015, à 18:13

pingouinux

Re : Question suppression / copie fichier

C'était à tester indépendamment du script.

Hors ligne

#16 Le 01/02/2015, à 18:23

tifil

Re : Question suppression / copie fichier

Pardon.

ls | nl :
-bash: /usr/bin/nl : erreur d'entrée sortie

ls | /usr/bin/nl:
-bash: /usr/bin/nl : erreur d'entrée sortie

type nl:
nl est /usr/bin/nl

Hors ligne

#17 Le 01/02/2015, à 18:48

pingouinux

Re : Question suppression / copie fichier

Je suis actuellement sur une distrib nommée: Live raizo, mais je viens d'essayer ce code sur un ubuntu, et je n'ai pas l'erreur du nl

Tu pourrais éventuellement comparer le résultat de man nl sur les 2 systèmes. Peut-être faut-il forcer la lecture sur l'entrée standard

ls | nl -

De toute façon, tu sais t'en sortir autrement.

Hors ligne

#18 Le 01/02/2015, à 18:56

tifil

Re : Question suppression / copie fichier

Même avec le tiret, j'ai cette erreur.
Par contre, peut-tu m'expliquer le symbole '@' dans le for ?
Donc étant donné que j'ai "trouvé une solution", en passant par une autre distrib, je peux poser une autre question ici même ?
Je cherche à faire la même chose, mais avec une copie.

Voici ma fonction copie:

function copie
{
echo "quel fichier ? :"
read j
echo "vers ou ? "
read dest

cp "${t$((j-1))]}" dest
}

Je n'ai pas de messages d'erreur, mais la copie ne s'effectue pas.

Hors ligne

#19 Le 01/02/2015, à 19:11

Watael

Re : Question suppression / copie fichier

salut,

nl ne me paraît pas une bonne solution : j'ai toujours un fichier nommé fais$'\n'chier wink
ce fichier ne posera pas de problème si on n'utilise que le développement de chemins du shell, et les indices du tableau.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#20 Le 01/02/2015, à 19:12

pingouinux

Re : Question suppression / copie fichier

Je n'ai pas de messages d'erreur, mais la copie ne s'effectue pas.

Elle s'est effectuée sur un fichier qui s'appelle dest. Il faut faire

cp "${t$((j-1))]}" "$dest"

peut-tu m'expliquer le symbole '@' dans le for ?

Voici un extrait de man bash, rubrique Arrays (c'est en anglais chez moi)

Any element of an array may  be  referenced  using  ${name[subscript]}.
       The braces are required to avoid conflicts with pathname expansion.  If
       subscript is @ or *, the word expands to all members  of  name.   These
       subscripts  differ only when the word appears within double quotes.  If
       the word is double-quoted, ${name[* ]} expands to a single word with the
       value  of each array member separated by the first character of the IFS
       special variable, and ${name[@]} expands each element of name to a sep‐
       arate  word.   When  there  are no array members, ${name[@]} expands to
       nothing.  If the double-quoted expansion  occurs  within  a  word,  the
       expansion  of  the first parameter is joined with the beginning part of
       the original word, and the expansion of the last  parameter  is  joined
       with  the  last  part  of  the original word.  This is analogous to the
       expansion of the special parameters * and  @  (see  Special  Parameters
       above).   ${#name[subscript]}  expands  to  the  length  of ${name[sub‐
       script]}.  If subscript is * or @, the expansion is the number of  ele‐
       ments  in the array.  Referencing an array variable without a subscript
       is equivalent to referencing the array with a subscript of 0.   If  the
       subscript used to reference an element of an indexed array evaluates to
       a number less than zero, it is interpreted as relative to  one  greater
       than  the  maximum  index  of the array, so negative indices count back
       from the end of the array, and an index of -1 references the last  ele‐
       ment.

Hors ligne

#21 Le 01/02/2015, à 19:17

pingouinux

Re : Question suppression / copie fichier

@Watael  #19 : Tu as raison (même si c'est un cas qui devrait être rarissime)

Hors ligne

#22 Le 01/02/2015, à 19:36

tifil

Re : Question suppression / copie fichier

Merci beaucoup pingouinux pour ton aide.
Tout fonctionne à merveille smile

Hors ligne