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 :

Problème avec find dans un script de migration owncloud


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Par défaut Problème avec find dans un script de migration owncloud
    Bonjour,

    Voici le contexte :

    j'ai un abonnement chez un hébergeur sur lequel j'ai installé le logiciel libre owncloud pour stocker mes fichiers à l'image de dropbox.

    Problème : L'erreur suivante se produit quand je tente de mettre à jour owncloud 8 serveur en allant sous admin puis en cliquant sur update

    M'aider à migrer mes fichiers de owcloud 8 vers owncloud 9. En effet, quand je tente de mettre à jour owncloud 8, l'erreur suivante se produit systématiquement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    Update failed.Unable to move /home/httpd/vhosts/domainname/httpdocs/owncloud/_oc-upgrade/8.2.9/core/core to /home/httpd/vhosts/domainename/httpdocs/owncloud/core
    Pour tenter de résoudre ce problème, 'ai donc décidé de migrer vers ownclous 9 à moins que vous n'ayez d'autre proposition

    J'ai donc écrit un petit script de migration dont le but et d'extraite les fichiers indispensable à owncloud puis de copier les fichiers restants

    Voici le code :

    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
     
    # ce script est une aide à la migration owncloud 8 vers owncloud 9
    # auteur Batant
     # créer le : 28.01.2017
     
     # créer un dossier de sauvegarde
     mkdir ~/backup_owncloud
     # scanner le dossier owcloud 9  
    for i in ls -la  ~/Téléchargements/owncloud_9 ; do
    	# rechercher le fichier dans l'ancien dossier et le déplacer dans backup
    	find ~/ownCloud -name $i -exec mv -R -v  {} backup_owncloud {} \;
    done
    # copier owcloud 9 dans le dossier utilisateur
    cp -R -v ~/Téléchargements/owncloud_9 ~/owncloud_9
    # copier les fichier owcloud sauvegardé dans owcloud 
    cp -R -v ~/backup_owncloud/ ~/Téléchargements/owncloud_9
    J'ai le problème suivant avec la commande find qui ne s'éxécute pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	find ~/ownCloud -name $i -exec mv -R -v  {} backup_owncloud {} \;
     
    find: attention*: les noms de fichiers Unix usuels ne contiennent pas de barre obliques (sauf pour les chemins).  Cela signifie que «*-name «/home/mparchet/Téléchargements/owncloud_9»*» sera toujours évalué comme étant faux sur ce système.  Vous pouvez trouver que le test «*-wholename*» est plus utile, ou encore celui-ci*: «*-samefile*». Alternativement, si vous utilisez GNU grep, vous pourriez utiliser «*find ... -print0 | grep -FzZ «/home/mparchet/Téléchargements/owncloud_9»*».
    je remarque par ailleurs que les script shell continue de s'exécuter même si une commande renvoie une erreur pourquoi ?

    pourriez-vous m'aider à résoudre ce problème surtout au niveau de find ?

    Meilleures salutations et encore bonne année

  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,

    la boucle ne sert à rien.
    find ne sert à rien.

    copie simplement ~/ownCloud vers ~/backup_ownCloud.

    et
    ON N'UTILISE PAS ls DANS UN SCRIPT !!!
    pourquoi ?
    parce que !*

    *fais une recherche sur le forum avec cette phrase; ça a été traité moult fois.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre très actif
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Par défaut
    Bonjour,

    Merci de m'avoir aider

    Je vous redis si ça ne marche pas mais pour l'instant ça à l'air de marcher

    Salutations

  4. #4
    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 Battant Voir le message
    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in ls -la  ~/Téléchargements/owncloud_9 ; do
    	# rechercher le fichier dans l'ancien dossier et le déplacer dans backup
    	find ~/ownCloud -name $i -exec mv -R -v  {} backup_owncloud {} \;
    done
    J'ai le problème suivant avec la commande find qui ne s'éxécute pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	find ~/ownCloud -name $i -exec mv -R -v  {} backup_owncloud {} \;
     
    find: attention*: les noms de fichiers Unix usuels ne contiennent pas de barre obliques (sauf pour les chemins).  Cela signifie que «*-name «/home/mparchet/Téléchargements/owncloud_9»*» sera toujours évalué comme étant faux sur ce système.  Vous pouvez trouver que le test «*-wholename*» est plus utile, ou encore celui-ci*: «*-samefile*». Alternativement, si vous utilisez GNU grep, vous pourriez utiliser «*find ... -print0 | grep -FzZ «/home/mparchet/Téléchargements/owncloud_9»*».
    ATTENTION! Comme bien précisé par N_BaH, on n'utilise pas "ls" dans un script...

    À part ça, la méthode utilisée n'est pas bonne pour plein de raisons (voir de nouveau la réponse de N_BaH)... mais, pour ta culture shell, si tu veux juste comprendre la cause de l'erreur (enfin, l'une des erreurs), dans la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in ls -la  ~/Téléchargements/owncloud_9 ; do
    la variable "i" (joli nom!) de la boucle "for" va énumérer les 3 valeurs "ls" puis "-la" puis "~/Téléchargements/owncloud_9", ce qui ne correspond probablement pas à ce que tu veux faire et va perturber la commande "find"...
    En fait, tu veux probablement le résultat de l'exécution de la commande "ls", ce qui se ferait de la manière suivante (si on pouvait utiliser "ls" dans un script (ce qui n'est pas le cas (ON NE DOIT PAS UTILISER "ls" DANS UN SCRIPT))):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in $(ls -la  ~/Téléchargements/owncloud_9) # ATTENTION: NE PAS UTILISER "ls" DANS UN SCRIPT!
     do # rechercher le fichier dans l'ancien dossier et le déplacer dans backup
    	find ~/ownCloud -name $i -exec mv -R -v  {} backup_owncloud {} \;
    done
    je remarque par ailleurs que les script shell continue de s'exécuter même si une commande renvoie une erreur pourquoi ?
    Ben oui. C'est le comportement standard d'un script shell.
    Si tu veux que le script s'arrête dès qu'il y a une erreur, il suffit de mettre un set -e, dans les premières lignes du script, mais attention, c'est très très contraignant!
    En effet, beaucoup de commandes renvoient facilement un code d'erreur...
    Du coup, il faut tout tester...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/sh
    set -e
    car=$1
    if echo "coucou" | fgrep "$car"; then
      echo "il y a un '$car' dans 'coucou'..."
    else
      echo "il n'y a pas de '$car' dans 'coucou'..."
    fi
    echo "on continue sans tester..."
    echo "coucou" | fgrep "$car"
    echo "peu de chances qu'on arrive ici, sauf s'il y a un '$car' dans 'coucou', bien sûr..."
    Voici la sortie produite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ./test.sh a
    il n'y a pas de 'a' dans 'coucou'...
    on continue sans tester...
    CQFD

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

Discussions similaires

  1. Problème d'incompatibilité dans un script avec read, IFS et rsync
    Par Jipété dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 27/04/2015, 19h06
  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 locate dans un script
    Par kopros2 dans le forum Administration système
    Réponses: 2
    Dernier message: 07/12/2011, 07h06
  4. problème avec graphique dans état access
    Par petitmic dans le forum Access
    Réponses: 5
    Dernier message: 07/09/2005, 14h55
  5. Problème avec TNMSMTP dans une boucle.
    Par Orgied dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/04/2004, 10h19

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