bonjour, j'en suis au chapitre sur les boucles du tuto sur linux de mateo21 et j'essaye de faire l'exercice vers la fin ou il faut creer un script qui renomme tous les fichiers qui correspondent au parametre 1 et qui leur rajoute le suffixe -old, et donc j'ai tapé ce code:
#!/bin/bash
for fichier in `ls $1`
do
mv $fichier $fichier-old
done
puis j'ai lancé le script en tapant:
Scripts/multirenommage.sh *.txt
avec 3 fichiers .txt dans mon repertoire actuel, il ne m'a rien affiché ce qui etait normal et donc j'ai fait un ls mais il n'y avait qu'un seul des trois fichiers .txt qui etait renommé!
aidez moi svp et merci d'avance
(tiens je viens de voir que ca fait un an pile poil que je suis sur le sdz lol )
Ce n’est qu’alors qu’il va réellement invoquer ton script.
Du coup, au sein de ton script, $1 ne contient non pas le "*.txt" que tu as saisi initialement, mais uniquement le premier fichier correspondant à ce pattern.
Pour empêcher le shell de procéder à l’expansion des wildcards, tu peux entourer l’argument de simples ou doubles quotes :
C'est un déterrage en règle , mais le post est totalement pertinent et c'est celui qui ma aider le mieux
J'ai pu donc faire en sorte que mon script modifie tout les fichiers que je crée mais je n'arrive pas bien utiliser l’astérisque quand je récupère l’extension avec read
#!/bin/bash
touch premier.txt deuxieme.txt troisieme.txt
if [ -z "$1" ]
then
read -p "retaper l'extention a modifier $ext"
for file in `ls`
do
if [ "$file" = "$ext" ]
then
echo "Trouvé $file ! et modifié"
mv "$file" "$file-old"
else
echo "Rien trouve"
fi
done
else
for file in `ls`
do
for f in "$@"
do
if [ "$file" = "$f" ]
then
echo "Trouvé $file ! et modifié"
mv "$file" "$file-old"
else
echo "Rien trouve"
fi
done
done
fi
Merci
gouttegd a écrit:
Salut,
C’est normal. Quand tu lances ton script de cette façon :
Scripts/multirenommage.sh *.txt
le shell va commencer par résoudre le "*.txt", et transformer ainsi ta commande en ceci :
Ce n’est qu’alors qu’il va réellement invoquer ton script.
Du coup, au sein de ton script, $1 ne contient non pas le "*.txt" que tu as saisi initialement, mais uniquement le premier fichier correspondant à ce pattern.
Pour empêcher le shell de procéder à l’expansion des wildcards, tu peux entourer l’argument de simples ou doubles quotes :
ensuite, préférer les globs (Développement des chemins, cf. man bash) à ls, parce que le shell les protège ce qu'il ne fait pas avec la sortie des (Substitutions de) commandes
puis, ne pas parcourir les sorties de Substitution de commandes avec une boucle for, parce que for lit des mots, pas des lignes
enfin, ne pas faire plusieurs fois la même chose dans des cas différents
test -n "$1" && ext=$1 || read -p "entrer une donnée" ext
for f in ./*."$ext"
do
mv "$f" "$f.old"
done
et c'est tout. ±
- Edité par dantonq 17 mars 2019 à 12:57:17
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
ensuite, préférer les globs (Développement des chemins, cf. man bash) à ls, parce que le shell les protège ce qu'il ne fait pas avec la sortie des (Substitutions de) commandes
puis, ne pas parcourir les sorties de Substitution de commandes avec une boucle for, parce que for lit des mots, pas des lignes
enfin, ne pas faire plusieurs fois la même chose dans des cas différents
test -n "$1" && ext=$1 || read -p "entrer une donnée" ext
for f in ./*."$ext"
do
mv "$f" "$f.old"
done
et c'est tout. ±
- Edité par dantonq il y a 44 minutes
Merci dantonq ,
Toujours réactif sur le sujet, malgré tout tu évoque des concepts inconnue pour moi a ce moment, j'ai lu tes autres réponse faite au différente question j'ai toujours eu un peu de mal a comprendre.
Tout de même j'ai essayé les différentes combinaison :
- Meme je ne perçois pas les raison, j'ai transformé mes test [ en " test " après avoir lu sa syntaxe c'est plus court tant mieux .
- Dans le man de bash pour lister le répertoire courant j'ai trouver cette commande : { list; } je n'est pas su l'utilisé ; tu a évoqué globs() la aussi pour moi c'est nébuleux.
- le denier point d’interrogation c'est que tu marque ça :
for f in ./*."$ext"
les deux point qui entoure le /* servent à quoi et quelle est la valeur de ton ext , .txt ou *.txt
- test n'est pas plus court que [, mais ça montre plus clairement que c'est une commande qui suit le if
- la description des globs se trouve dans le man à Développement des chemins
- oula. les accolades servent à grouper des commandes; elles forment alors une liste de commandes. il ne s'agit pas d'une commande qui liste les fichiers.
- le premier point représente le répertoire courant : un point: ./ -> répertoire courant deux points: ../ -> répertoire parent
- dans code donné, le deuxième point, c'est celui qui sépare le nom du fichier de son extension
nomFichier.ext
^
----------'
- Edité par dantonq 17 mars 2019 à 16:11:18
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
multirenommage.sh
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique