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 :

Copie de fichier en fonction avec incrémentation


Sujet :

Shell et commandes GNU

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut Copie de fichier en fonction avec incrémentation
    j'ai un répertoire nommé ned_ajout_csv avec des fichiers fich fich_1 fich_2
    j'aimerais chercher le fichier ayant le plus grand numéro exemple fich_n et copier le fichier fich en fich_n+1
    par exemple ,si dans le repertoire ned_ajout_csv le dernier fichier est fich_8 donc je copie fich en fich_9
    j'ai fait quelque chose comme celà mais je ne suis pas sur du tout que c'est bon
    merci pour votre aide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for i in ned_ajout_csv/*
    do
    cp $i `echo $i | sed 's/\([0-9.]+\)/\1zz/g'`
    done

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 153
    Par défaut
    Citation Envoyé par bigs3232 Voir le message
    j'ai fait quelque chose comme cela mais je ne suis pas sûr du tout que c'est bon
    Quand j'ai des choses tordues comme ça à faire, je me crée un dossier de test qui va ressembler comme deux gouttes d'eau au dossier de prod, avec les mêmes noms de fichiers, et je teste dans le dossier de... test ! Il est où le problème ?

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 371
    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 371
    Par défaut
    En l'état, ça doit recopier ton fichier fich_n en fich_n et donc avec la possibilité de le vider.

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    j'ai cette erreur et je ne sais pas comment faire pour chercher le chiffre maximum et incrémenter
    cp: 'ned_ajout_csv/ned_ajout_1.csv' et 'ned_ajout_csv/ned_ajout_1.csv' identifient le même fichier

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 371
    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 371
    Par défaut
    Voici un exemple en bash:
    Le contenu de mon répertoire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ ls -1
    fich_10.csv
    fich_1.csv
    fich_2.csv
    fich_3.csv
    fich_4.csv
    fich_5.csv
    fich_6.csv
    fich_7.csv
    fich_8.csv
    fich_9.csv
    la ligne en bash pour traiter (ici, je ne fais qu'un echo) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ for i in $(echo * | sed 's/[^0-9]/\n/g' | sort -rnu); do echo mv fich_${i}.csv fich_$((i+1)).csv; done
    mv fich_10.csv fich_11.csv
    mv fich_9.csv fich_10.csv
    mv fich_8.csv fich_9.csv
    mv fich_7.csv fich_8.csv
    mv fich_6.csv fich_7.csv
    mv fich_5.csv fich_6.csv
    mv fich_4.csv fich_5.csv
    mv fich_3.csv fich_4.csv
    mv fich_2.csv fich_3.csv
    mv fich_1.csv fich_2.csv

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    balèse disedorgue.j'essaie de comprendre votre code .pas facile

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 371
    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 371
    Par défaut
    Il n'y a rien de compliqué:
    $(echo * | sed 's/[^0-9]/\n/g' | sort -rnu): est la seule partie intéressante. Elle prend la liste des fichiers dans le répertoire courant, remplace tout ce qui n'est pas un nombre par un retour à la ligne et ensuite trie ces nombre (-n) en ordre inverse (-r) et en retirant les doublons (-u), ce qui permet d'avoir le plus grand nombre en premier dans la boucle for...

  8. #8
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    super explication tres claire.je ne comprends pas pourquoi remplace tout ce qui n'est pas un nombre par un retour à la ligne
    pour récuperer le chiffre dans le fichier pourquoi ne pas utiliser ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in $(echo * | sed 's/\([0-9]+\)/\1/g' | sort -rnu); do echo $i; done

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Citation Envoyé par bigs3232 Voir le message
    pour récuperer le chiffre dans le fichier pourquoi ne pas utiliser ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in $(echo * | sed 's/\([0-9]+\)/\1/g' | sort -rnu); do echo $i; done
    Ben, commence par faire un essai avec une version simplifiée de la commande et regarde le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo * | sed 's/\([0-9]+\)/\1/g'
    et essaie d'imaginer les conséquences de sed 's/\(quelque chose\)/\1/g'...

  10. #10
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    comme celà ca marche il maque \ devant +
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo * | sed 's/\([0-9]\+\)/\1aa/g'
    resultat
    par contre j'aimerais si dans mon repertoire j'ai
    fich_1.csv
    fich_2.csv
    fich_3.csv
    fich_4.csv
    et que je voudrais connaitre le chiffre maximum c'est a dire ici le 4 je ne sais pas faire celà

  11. #11
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    je viens de comprendre le code de disedorgue qui donne le nombre maximum en 1er ligne .mais comment je fais pour récupérer ce nombre dans une variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $(echo * | sed 's/[^0-9]/\n/g' | sort -rnu)

  12. #12
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 371
    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 371
    Par défaut
    Dans mon exemple, tu le récupères dans la variable i lors de la première itération de la boucle for...

    Quel est le besoin de le récupérer explicitement dans une variable ?

  13. #13
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    une fois j'aurais i je voudrais lancer ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cp fich.csv fich_$((i+1)).csv

  14. #14
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 371
    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 371
    Par défaut
    Juste sur le plus grand ou sur tous ?

  15. #15
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    juste sur le plus grand

  16. #16
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 371
    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 371
    Par défaut
    Dans ce cas, quelque chose comme ci-dessous devrait le faire (pas testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var=$(echo * | sed 's/[^0-9]/\n/g' | sort -rnu | head -1)

  17. #17
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    oui superbe disedorgue c'est bon.j'ai l'impression que c'est la seule méthode pour arriver à ce résultat
    une idée comme celà .on récupère les chiffre dans un array et on trouve direct le chiffre max c'est ce que je ferais en php mais en shell c'est une autre paire de manche

  18. #18
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 371
    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 371
    Par défaut
    Une version built-in bash:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    j=0;for i in *; do [[ "${i//[^0-9]/}" -gt "$j" ]] && j=${i//[^0-9]/} ; done ; echo $j
    ici, à la fin, la variable j aura la plus grande valeur.

  19. #19
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Citation Envoyé par bigs3232 Voir le message
    j'ai l'impression que c'est la seule méthode pour arriver à ce résultat
    une idée comme celà .on récupère les chiffre dans un array et on trouve direct le chiffre max c'est ce que je ferais en php mais en shell c'est une autre paire de manche
    Bon, ben, voilà déjà une manche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    l_fic=( * )
    max=${#l_fic[@]}
    last_fic=${l_fic[$((max - 1))]}
    echo "max=${max} last_fic=${last_fic}"
    À noter que, si le nombre est garanti, l'ordre l'est beaucoup moins.

    Par exemple, "fic10.txt" apparaît avant "fic2.txt" dans l'ordre alphabétique...
    Dans ce cas, il aurait mieux valu générer "fic02.txt" qui apparaît bien avant "fic10.txt".

  20. #20
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    concernant jack oui effectivement mais ca ne marche pas si c'est plus de 10
    mais le dernier code de disedorgue est incroyable .ca marche parfaitement.ceci dit le code mérite explication car trop complexe pour moi

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. BASH: copie de fichiers en fonction d'un motif en récursif, et avec écrasement
    Par Oursdeglace dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 24/06/2011, 11h46
  2. Réponses: 4
    Dernier message: 17/12/2008, 18h47
  3. Copie de fichier par FTP avec un BAT
    Par Thony_7 dans le forum Windows
    Réponses: 11
    Dernier message: 31/05/2007, 16h54
  4. [FTP] Probleme de copie de fichier en reseaux avec easphp
    Par needles94000 dans le forum Langage
    Réponses: 17
    Dernier message: 29/03/2006, 15h24
  5. Copy de fichier sur réseau avec mot de passe
    Par Guile dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 07/10/2005, 15h45

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