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 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. wink

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 smile


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..."

Jarodd a écrit :

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 smile


Ubuntu 22.04.3 LTS (64 bits)

Hors ligne