#1 Le 03/05/2020, à 21:02
- Jarodd
[Résolu] cp avec étoile : "impossible d'évaluer..."
Bonjour,
Je suis débutant en script. J'essaye de me faire un petit de backup de certains fichiers, mais je bute sur une erreur lors de la copie de fichiers.
Lorsque je fais un cp avec le nom des fichiers, cela fonctionne bien :
cp -pr "$src_home_jarodd.unison/default.prf" $dst_unison
cp -pr "$src_home_jarodd.unison/home_jarodd_Documents.prf" $dst_unison
J'essaye alors en remplaçant les fichiers par un *,
cp -pr "$src_home_jarodd.unison/*.prf" $dst_unison
mais là j'obtiens l'erreur suivante :
cp: impossible d'évaluer '/home/jarodd/.unison/*.prf': Aucun fichier ou dossier de ce type
Je ne comprends pas cette erreur. Le web regorge de sujets avec ce libellé, mais aucun ne me renvoie à des solutions qui ne s'appliquent pas à mon cas (espaces dans les noms, disque non monté,...).
Le script complet, il faut décommenter le test souhaité :
#!/bin/bash
src_home_jarodd="/home/jarodd/"
dst_unison=$dst_racine"/home/jarodd/Bureau/unison_backup"
mkdir -p "$dst_unison"
# TEST 1 : OK
#cp -pr "$src_home_jarodd.unison/default.prf" $dst_unison
#cp -pr "$src_home_jarodd.unison/home_jarodd_Documents.prf" $dst_unison
# TEST 2 : KO
#cp -pr "$src_home_jarodd.unison/*.prf" $dst_unison
J'ai également testé en sortant les variables des guillemets, même résultat.
Merci pour votre aide.
Edit 04/05 : résolu, par un ajout de guillemets autour des variables
Dernière modification par Jarodd (Le 04/05/2020, à 20:22)
Ubuntu 22.04.3 LTS (64 bits)
Hors ligne
#2 Le 03/05/2020, à 21:58
- abelthorne
Re : [Résolu] cp avec étoile : "impossible d'évaluer..."
Entre guillemets, le shell interprète les variables (il remplace $src_home_jarodd par /home/jarodd/, par exemple) mais pas les caractères spéciaux. Dans tes exemples, il ne remplace pas l'étoile par tous les fichiers, il cherche un fichier qui s'appelle *.prf, d'où le message d'erreur qui te dit qu'il n'existe pas. De la même façon, pour désigner ton dossier perso, tu peux utiliser $HOME entre guillemets mais pas ~ (il cherche alors un dossier qui s'appelle ~).
Ça devrait fonctionner en les supprimant :
cp -pr $src_home_jarodd.unison/*.prf $dst_unison
EDIT : j'ajoute qu'il y a une différence entre les guillemets doubles et les guillemets simples (" et '). Si tu mets une chaîne entre guillemets simples, les variables d'environnements telles que $src_home_jarodd ou $HOME ne seront pas interprétées.
EDIT 2 : l'intérêt des guillemets est surtout de traiter des chemins qui peuvent avoir des espaces dans leur nom, et éviter qu'ils soient interprétés comme des séparateurs. En effet, si par exemple ta variable $src_home_jarodd correspond au chemin /home/jarodd/mon chouette dossier/ et que tu lances la commande suivante :
cp -pr $src_home_jarodd.unison/*.prf $dst_unison
cp va recevoir en paramètres /home/jarodd/mon, chouette et dossier/.unison/*.prf, ce qui ne correspondra à rien. Pour éviter ça, il faudrait donc mettre des guillemets. Mais l'étoile ne sera alors pas interprétée. Dans ce genre de cas, je ne pense pas qu'il y ait un autre moyen que d'abord se déplacer dans le dossier en utilisant des guillemets autour de la variable, puis de copier les fichiers sans utiliser de guillemets :
cd "$src_home_jarodd.unison"
cp -pr *.prf "$dst_unison"
(Du coup, autant mettre des guillemets autour de la variable désignant le dossier de destination pour les mêmes raisons.)
Dernière modification par abelthorne (Le 03/05/2020, à 22:15)
Hors ligne
#3 Le 04/05/2020, à 01:08
- kamaris
Re : [Résolu] cp avec étoile : "impossible d'évaluer..."
Il faut concaténer les morceaux de chaine avec et sans guillemets :
cp -pr "$src_home_jarodd.unison"/*.prf "$dst_unison"
Hors ligne
#4 Le 04/05/2020, à 13:45
- Jarodd
Re : [Résolu] cp avec étoile : "impossible d'évaluer..."
Bonjour,
Très bien merci, je vais essayer ça.
J'ai une question "bonne pratique" : quand je déclare une chemin dans une variable, est-ce bien de mettre le / final ?
De plus, j'ai pris l'habitude de mettre des guillemets pour séparer le répertoire du fichier :
cp -p $src_home_jarodd"monfichier" $dst"monfichier"
Ici ça passe car le fichier est donc /home/jarodd/monfichier, mais sans guillemets, j'aurai $src_home_jaroddmonfichier. Y a-t-il un autre moyen, pour se passer des guillemets ? (j'ai noté le cd avant de faire le cp)
Dernière modification par Jarodd (Le 04/05/2020, à 19:51)
Ubuntu 22.04.3 LTS (64 bits)
Hors ligne
#5 Le 04/05/2020, à 14:32
- Watael
Re : [Résolu] cp avec étoile : "impossible d'évaluer..."
je ne mets pas de slash en fin de chemin d'un répertoire lors de la définition d'une variable.
je mets toujours des guillemets autour des variables. TOUJOURS! à moins de savoir pourquoi.
monDir=/chemin/repertoire
printf 'par exemple : %s\n' "$monDir/nomFichierIncomplet"*
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 04/05/2020, à 20:21
- Jarodd
Re : [Résolu] cp avec étoile : "impossible d'évaluer..."
Merci pour le coup de main
Ubuntu 22.04.3 LTS (64 bits)
Hors ligne
#7 Le 04/05/2020, à 23:59
- kamaris
Re : [Résolu] cp avec étoile : "impossible d'évaluer..."
Ici ça passe car le fichier est donc /home/jarodd/monfichier, mais sans guillemets, j'aurai $src_home_jaroddmonfichier. Y a-t-il un autre moyen, pour se passer des guillemets ?
Dans ces cas-là, en général, il faut recourir aux crochets :
"${src_home_jarodd}monfichier"
Mais dans ce cas en particulier, il vaut mieux sortir le / de la variable, effectivement (il remplace avantageusement les crochets comme séparateur).
Hors ligne
#8 Le 05/05/2020, à 09:50
- Jarodd
Re : [Résolu] cp avec étoile : "impossible d'évaluer..."
Ok je vais adapter mon script. J'ai appris plein de choses, merci
Ubuntu 22.04.3 LTS (64 bits)
Hors ligne