IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[bash] Problème avec cp dans un script


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Janvier 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2017
    Messages : 4
    Par défaut [bash] Problème avec cp dans un script
    Bonsoir,

    J'ai 3 fichiers à copier indépendamment d'un dossier à un autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      Control_M221_Di-Do_v1.5.0.1
      Control_M221_Di-Do_v1.5.0.1.exe
      Control_M221_Di-Do_v1.5.0.1.dmg
    Je suis dans le dossier /G/Control_M221_Di-Do/Control_M221_Di-Do

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cp -fp /G/Control_M221_Di-Do/Control_M221_Di-Do/dist/Control_M221_Di-Do_v1.5.0.1.exe ../Livraisons/Control_M221_Di-Do_v1.5.0.1
     
    cp -fp /G/Control_M221_Di-Do/Control_M221_Di-Do/dist/Control_M221_Di-Do_v1.5.0.1 ../Livraisons/Control_M221_Di-Do_v1.5.0.1
     
    cp -fp /G/Control_M221_Di-Do/Control_M221_Di-Do/dist/Control_M221_Di-Do_v1.5.0.1.dmg ../Livraisons/Control_M221_Di-Do_v1.5.0.1
    Le 2eme cp refait une copie de "Control_M221_Di-Do_v1.5.0.1.exe"
    C'est en ajoutant l'option -i que je l'ai découvert

    Comment corriger ce problème, SVP ?

    D'avance Merci

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Bonjour,

    J'ai 3 fichiers à copier indépendamment
    pourquoi "indépendamment" ?

    Je suis dans le dossier /G/Control_M221_Di-Do/Control_M221_Di-Do
    pourquoi, alors, indiquer le chemin absolu ?

    donne-nous le retour de cette commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls -l /G/Control_M221_Di-Do/Control_M221_Di-Do/dist/Control_M221_Di-Do_v1.5.0.1*
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Janvier 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2017
    Messages : 4
    Par défaut
    En fait, mon script copie un certain nombre de fichiers dans un dossier pour le zippé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $ ls -l /G/Control_M221_Di-Do/Control_M221_Di-Do/dist/Control_M221_Di-Do_v1.5.0.1*
    -rw-r--r-- 1 renaud 197609 11611296 mai   16 20:36 /G/Control_M221_Di-Do/Control_M221_Di-Do/dist/Control_M221_Di-Do_v1.5.0.1
    -rw-r--r-- 1 renaud 197609  9775707 mai   16 17:11 /G/Control_M221_Di-Do/Control_M221_Di-Do/dist/Control_M221_Di-Do_v1.5.0.1.dmg
    -rwxr-xr-x 1 renaud 197609 13489444 mai   17 23:09 /G/Control_M221_Di-Do/Control_M221_Di-Do/dist/Control_M221_Di-Do_v1.5.0.1.exe*
    Je pourrai modifié mon script pour faire un seul appel à cp afin de copier les 3 fichiers.
    Mais j'ai une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $ cp -fp /G/Control_M221_Di-Do/Control_M221_Di-Do/dist/Control_M221_Di-Do_v1.5.0.1*  ../Livraisons/Control_M221_Di-Do_v1.5.0.1
    cp: cannot stat '/G/Control_M221_Di-Do/Control_M221_Di-Do/dist/Control_M221_Di-Do_v1.5.0.1*': No such file or directory

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    et que donne la commande alias et la commande type cp ?

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    et si, au lieu du cp, dans le script, tu mets le ls que je t'ai indiqué ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Janvier 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2017
    Messages : 4
    Par défaut
    Voici le résultat du ls dans mon script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    total 34064
    -rw-r--r-- 1 renaud 197609 11611296 mai   16 20:36 Control_M221_Di-Do_v1.5.0.1
    -rw-r--r-- 1 renaud 197609  9775707 mai   16 17:11 Control_M221_Di-Do_v1.5.0.1.dmg
    -rwxr-xr-x 1 renaud 197609 13489439 mai   18 17:46 Control_M221_Di-Do_v1.5.0.1.exe
    dans mon dossier il y a 3 fichiers avec la même basename...

    J'ai trouvé

    J'ai juste changé l'ordre des copies en commençant par
    Control_M221_Di-Do_v1.5.0.1 puis Control_M221_Di-Do_v1.5.0.1.exe et Control_M221_Di-Do_v1.5.0.1.exe

    Merci a tous

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 117
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 117
    Par défaut
    Oui, l'absence de fichier sans extension, à la deuxième ligne, et c'est normal car la première ligne copie le .exe sur le sans-extension qui devient donc un .exe.

    Mais l'erreur ne peut survenir que si dossier source et dossier cible sont les mêmes, d'où mon interrogation à propos des chemins.

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    je ne comprends pas.

    quand un répertoire destination n'existe pas le message d'erreur est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cp: cannot create regular file [...]
    Or, ici, le message d'erreur (cp: cannot stat[...]) porte bien sur le fichier source dont le chemin absolu est donné.

    mais effectivement, l'absence de / final dans le chemin du répertoire destination provoque la copie le fichier source vers ce que cp interprète comme un nom de fichier.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 117
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 117
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    ... fichier source vers ce que cp interprète comme un nom de fichier.
    Oui, et ça pourrait arriver en cas de raccourci mal à propos dans un chemin.

    Hélas, quand je vois ça,
    Inscrit en: janvier 2017
    Messages: 3
    je me dis qu'on n'est pas près de le revoir pour lever le voile sur ce mystère…

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Ren34 Voir le message
    Bonsoir,

    J'ai 3 fichiers à copier indépendamment d'un dossier à un autre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cp -fp /G/Control_M221_Di-Do/Control_M221_Di-Do/dist/Control_M221_Di-Do_v1.5.0.1.exe ../Livraisons/Control_M221_Di-Do_v1.5.0.1
     
    cp -fp /G/Control_M221_Di-Do/Control_M221_Di-Do/dist/Control_M221_Di-Do_v1.5.0.1 ../Livraisons/Control_M221_Di-Do_v1.5.0.1
     
    cp -fp /G/Control_M221_Di-Do/Control_M221_Di-Do/dist/Control_M221_Di-Do_v1.5.0.1.dmg ../Livraisons/Control_M221_Di-Do_v1.5.0.1
    Soit (ce dont je doute, vu que tu dis "d'un dossier à un autre") "../Livraisons/Control_M221_Di-Do_v1.5.0.1" est le nom d'un fichier destiné à être écrasé successivement par les 3 copies...
    soit (ce qui me semble plus probable) "../Livraisons/Control_M221_Di-Do_v1.5.0.1" est le nom d'un répertoire destiné à recevoir les 3 fichiers.

    Dans ce cas, pour éviter toute erreur délicate à débusquer, il me semble préférable de mettre un "/" à la fin du 2ème argument de "cp", juste pour indiquer qu'on ne copie pas un fichier vers un fichier, mais qu'on copie un fichier dans un répertoire existant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cp -fp /G/Control_M221_Di-Do/Control_M221_Di-Do/dist/Control_M221_Di-Do_v1.5.0.1.exe ../Livraisons/Control_M221_Di-Do_v1.5.0.1/
     
    cp -fp /G/Control_M221_Di-Do/Control_M221_Di-Do/dist/Control_M221_Di-Do_v1.5.0.1 ../Livraisons/Control_M221_Di-Do_v1.5.0.1/
     
    cp -fp /G/Control_M221_Di-Do/Control_M221_Di-Do/dist/Control_M221_Di-Do_v1.5.0.1.dmg ../Livraisons/Control_M221_Di-Do_v1.5.0.1/
    [HS] Pour ma part, j'ai toujours trouvé douteux la double sémantique de "cp":
    - parfois copier un fichier vers un autre fichier cible (existant ou pas),
    - parfois copier un ou plusieurs fichiers vers un répertoire cible (qui doit exister)...

    Amha, c'est vraiment rarissime que l'auteur de la ligne de code du "cp" ne sache pas statiquement (i.e. au moment de l'écriture du programme) laquelle de ces deux sémantiques il appelle de ses voeux.

    D'ailleurs, j'aimerais bien qu'on me montre un script sensé contenant un cp "$a" "$b" ou "$b" pourrait parfois être un fichier ou parfois un directory...

    En conséquence de quoi, avoir 2 noms différents pour copy-file et copy-to-dir ne serait pas pénalisant et éviterait bien des soucis... mais le poids de l'histoire (et l'impératif de compatibilité)...

    En combinant ce comportement à l'extension de "*", qui peut produire parfois 1, parfois plusieurs fichiers, on obtient quelquefois des bugs pas tristes...
    En fait, je me rends compte que, globalement, j'aime bien quand les coquilles, erreurs d'étourderies ou autres bugs provoquent une erreur claire...

    [/HS]

  11. #11
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Janvier 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2017
    Messages : 4
    Par défaut
    Bonjour Messieurs,

    Excusé moi, je ne pensais pas que ma galère intéresse autant de monde

    Mon script fait 500 lignes, il me permet de compiler avec "pyinstaller" mon projet python et de créer un dossier d'achives.
    Il contient tous les fichiers sources (*.sh, *.py, *.ico, *icns, .txt, *.md, ...) de mon projet ainsi que les 3 versions de mon application.

    Il tourne dans le shell fournis par l'installation de GIT.

    Je le fait pour 3 plateformes (Windows, Linux, MacOS), en utilisant le même script (avec dos2unix )

    Pardonnez moi si j'ai trop simplifié mon problème.

    Le dossier de départ est :
    G:\DEV\Python\Control_M221_Di-Do\Control_M221_Di-Do\dist\

    Le dossier d'arrivé est :
    G:\DEV\Python\Control_M221_Di-Do\Livraisons\Control_M221_Di-Do_v1.5.0.1\

    Le dossier ou est mon script est:
    G:\DEV\Python\Control_M221_Di-Do\Control_M221_Di-Do\

    Pour corriger mon problème, j'ai juste copier l'application version Linux sans extension en 1er, après la version Windows et la version MacOS :

    Lorsque j'inverse la copie Windows avant la version Linux la variable sAppName garde l'extension ".exe" qui provoque la copie 2 fois de la version Windows

    note: l'ajout du caractère '/' à la variable $targetDir ne change rien...
    les fichiers ou les dossiers copier dans le dossier destination sont bien présent...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
        Color_Off='\033[0m'       # Text Reset
     
        Green='\033[0;32m'        # Green
     
        BGreen='\033[1;32m'       # Green
     
     
        livraisons_folder="../Livraisons/"     
     
        pyInstall_Name="Control_M221_Di-Do"
     
        # dans mon script je récupéré le numéro de version dans un autre fichier mais le résultat est ca
        pyInstall_version="_v1.5.0.1"
     
        currentFolder=$(pwd)
     
        pyInstall_dist="dist"
     
        ### partie du script...
     
        if [ ! -d $livraisons_folder ]
        then
            echo -e $Green "Create folder :" $livraisons_folder $Color_Off    
            mkdir $livraisons_folder
        fi
     
        targetDir=$livraisons_folder$pyInstall_Name$pyInstall_version
        if [ -d $targetDir ]
        then
            targetDir=$livraisons_folder$pyInstall_Name$pyInstall_version"_SAV"
        fi
     
        if [ ! -d $targetDir ]
        then
            echo -e $BGreen "Create backup folder : " $targetDir $Color_Off
            mkdir $targetDir
            echo
            sAppName="$currentFolder""/""$pyInstall_dist""/""$pyInstall_Name""$pyInstall_version"
            if [[ -f "$sAppName" ]] # LINUX
            then
                file_size_kb=`du -k "$sAppName" | cut -f1`
                echo -e $Green "Copying LINUX app    " "$sAppName" "     of " $file_size_kb "kb" $Color_Off
                cp -fpv "$sAppName" "$targetDir" # "/""$pyInstall_Name""$pyInstall_version"
                echo
            fi
            if [[ -f "$sAppName"".exe" ]] # WINDOWS
            then   
                file_size_kb=`du -k "$sAppName"".exe" | cut -f1`
                echo -e $Green "Copying WINDOWS app  " "$sAppName"".exe  of " $file_size_kb "kb" $Color_Off
                cp -fpv "$sAppName"".exe" "$targetDir"
                echo
            fi
            if [[ -f "$sAppName"".dmg" ]]  # MAC OSX
            then    
                file_size_kb=`du -k "$sAppName"".dmg" | cut -f1`
                echo -e $Green "Copying Mac OS X app " "$sAppName"".dmg" " of " $file_size_kb "kb" $Color_Off
                cp -fpv "$sAppName"".dmg" "$targetDir"
                echo
            fi
     
            cp -fp *.spec "$targetDir"
            cp -fp *.icns "$targetDir"
            cp -fp *.desktop "$targetDir"
            cp -fp *.code-workspace "$targetDir"
            # copy icon in folder /Pictures. These icons are in base64 in the source code
            cp -R "Pictures" "$targetDir""/Pictures"
            # copy manual in folder /Documents.
            cp -R "Documents" "$targetDir""/Documents"
            # history of the development of the project
            cp -fp "Evolution_Release.md" "$targetDir"
            # Copy Icon for application
            cp -fp appIcon_x64_T_256x256.gif "$targetDir"
            cp -fp appIcons_T_512x512.ico "$targetDir"
     
            ### suite du script et fin ...
    J'espère être assez clair maintenant

    Pas de problème pour vous répondre si vous avez d'autres question

    Merci

  12. #12
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 117
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 117
    Par défaut
    Bonjour,

    J'ai récrit ton post (je n'ai pas lu le code), assez indigeste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Le dossier de départ est :
    G:\DEV\Python\Control_M221_Di-Do\Control_M221_Di-Do\dist\
     
    Le dossier d''arrivée est :
    G:\DEV\Python\Control_M221_Di-Do\Livraisons\Control_M221_Di-Do_v1.5.0.1\
     
    Le dossier où est mon script est:
    G:\DEV\Python\Control_M221_Di-Do\Control_M221_Di-Do\
    J'ai simplifié (j'ai fait sauter le "e" de arrivée pour un bon alignement vertical) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    départ G:\DEV\Python\Control_M221_Di-Do\Control_M221_Di-Do\dist\
    arrivé G:\DEV\Python\Control_M221_Di-Do\Livraisons\Control_M221_Di-Do_v1.5.0.1\
    script G:\DEV\Python\Control_M221_Di-Do\Control_M221_Di-Do\
    J'ai condensé en virant tout ce qui était identique au début des lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    départ Control_M221_Di-Do\dist\
    arrivé Livraisons\Control_M221_Di-Do_v1.5.0.1\
    script Control_M221_Di-Do\

    Ce que je me permets de te conseiller c'est de créer un dossier de tests et un script pour tester avec lesquels tu vas bosser jusqu'à ce que ça soit parfait et ensuite tu passeras à la vraie vie.

    Alors un dossier de tests ça pourrait être G:\DEV\Python\tests et dans ce dossier trois dossiers,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    - départ
    - arrivé
    - script
    Les autres dossiers (dido, dist, etc.) ne servent à rien, tu les vires.

    Et dans le script tu mets les chemins en dur, pas de ..\ qui complique les choses quand elles sont déjà suffisamment illisibles comme ça.

    Après, c'est toi qui vois.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec find dans un script de migration owncloud
    Par Battant dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 29/01/2017, 10h47
  2. [Batch] Problème avec unzip dans script d'installation
    Par killgones dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 09/07/2014, 10h24
  3. [Bash] Problème avec paramètres dans variables
    Par bisol dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 09/03/2013, 17h39
  4. Impossible d'exécuter une commande avec su dans un script bash
    Par koshieDotFr dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 18/12/2012, 13h47
  5. [Bash] Problème avec locate dans un script
    Par kopros2 dans le forum Administration système
    Réponses: 2
    Dernier message: 07/12/2011, 07h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo