#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
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
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
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
Hors ligne