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

Linux Discussion :

Copie fichier sans modif du nom


Sujet :

Linux

  1. #1
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 30
    Points : 14
    Points
    14
    Par défaut Copie fichier sans modif du nom
    Bonjour à tous
    J'ai une question :

    Partons du principe qu'on ait un repertoire A/ qui contient plusieurs fichiers .txt.
    Ces fichiers sont de la forme XXX_DateDuJour .txt, où XXX est qqchose qu'on ne connaît pas à l'avance, et on ne connait pas le nombre de fichiers qu'il y'a

    Ma question est : est-il possible de copier ces fichiers du rep A/ vers un autre repertoire B/ en ne modifiant pas tout ce qui est XXX_DateDuJour et simplement en modifiant l'extension finale du fichier, soit :
    A l'origine on a : A/XXX_DateDuJour.txt , A/YYYYY_DateDuJour.txt, etc...
    et à la fin on aurait :
    B/XXX_DateDuJour.tmp , B/YYYYY_DateDuJour.tmp,

    tout en sachant que chaque Jour, XXX et YYYY sont différents, qu'il peut y'avoir n fichiers et non seulement 2, etc... (choses qu'on ne connait pas à l'avance).

    Pour le moment, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if [ "$IND" = "VIROUT" ]
      then mkdir B/
           cp A/*$(date +%Y%m%d).txt B/
           exit 0
    fi
    ceci vous l'aurez compris ne fait que copier les fichiers XXX_DateDuJour.txt de A/ vers B/, mais ne les renomme pas (en .tmp, ou autre peu importe). Ca ne sert seulement qu'à faire la sélection sur les fichiers qui portent dans leur nom la date du jour, donc les fichiers qui nous intéressent.

    Ma contrainte est donc que je souhaiterais que dans B/ les fichiers portent le même début de nom mais .tmp (par exemple) à la place du .txt MAIS tout en sachant que je ne sais pas le début du nom, combien y'a de fichiers etc...

    Merci à tous si qqun a déjà rencontré ce genre de cas de figure et aurait une idée sur le sujet!

    Bonne soirée,

    A+
    Nico

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if [ "$IND" = "VIROUT" ];  then
       cd A
       [[ ! -e B ]] && [[ ! -d  B ]] && mkdir B || echo "B existe déjà"
       for fichier in *$(date +%Y%m%d).txt
       do
          cp "$fichier" "../B/${fichier%%.*}.tmp"
       done
    fi
    cd $OLDPWD
    en principe ça devrait fonctionner.

    ps : pour `${fichier%%.*}`, cf. man bash - Remplacement des paramètres.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    je pense qu'il veut seulement déplacer les fichier d'aujourd'hui sinon il s'embeterait pas ainsi

  4. #4
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 30
    Points : 14
    Points
    14
    Par défaut
    Merci pour les ifnos, les commandes marchent nickel,

    cela dit POUR INFO : je me suis rendu compte que si le chemin A/ est codé sous forme de variable d'environnement, mettons que l'on ait $A qui pointe vers /truc/machin/bidule/,
    alors du coup le cp ne se fait pas :

    cp: cannot stat `*20090612.txt': No such file or directory
    (est-ce le cd qui se fait pas en amont et du coup la boucle for trouve rien...?? Pourtant )

    Merci encore en tout cas!

    A+

    Nico

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    ?
    pour moi ça passe
    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
    mkdir test/truc
    for (( a = 0; a < 5; a++ ))
     do
       touch test/truc/abc-${a}_$(date +%Y%m%d).txt
    done
     
    IND="VIROUT"
    A="test/truc"
    if [ "$IND" = "VIROUT" ]
       then
          cd $A
          [[ ! -e B ]] && [[ ! -d  B ]] && mkdir B || { echo "B existe déjà. Appuyer sur Entrée, ou Ctrl-C "; read; };
          for fichier in *$(date +%Y%m%d).txt
           do
              cp "$fichier" "B/${fichier%%.*}.tmp"
          done
    fi
    cd $OLDPWD; ls -1 ${A}/B
    abc-0_20090612.tmp
    abc-1_20090612.tmp
    abc-2_20090612.tmp 
    abc-3_20090612.tmp
    abc-4_20090612.tmp

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 739
    Points : 31 068
    Points
    31 068
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    ?
    pour moi ça passe
    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
    mkdir test/truc
    for (( a = 0; a < 5; a++ ))
     do
       touch test/truc/abc-${a}_$(date +%Y%m%d).txt
    done
     
    IND="VIROUT"
    A="test/truc"
    if [ "$IND" = "VIROUT" ]
       then
          cd $A
          [[ ! -e B ]] && [[ ! -d  B ]] && mkdir B || { echo "B existe déjà. Appuyer sur Entrée, ou Ctrl-C "; read; };
          for fichier in *$(date +%Y%m%d).txt
           do
              cp "$fichier" "B/${fichier%%.*}.tmp"
          done
    fi
    cd $OLDPWD; ls -1 ${A}/B
    abc-0_20090612.tmp
    abc-1_20090612.tmp
    abc-2_20090612.tmp 
    abc-3_20090612.tmp
    abc-4_20090612.tmp
    J'aime bien le ${...%%...} car je ne sais pas m'en servir donc ça m'apprend. Dommage pour le cd (perso j'aime pas faire du cd dans mes scripts si on peut s'en passer). Et le for file in machin a un gros inconvénient si le nom du fichier contient un espace.
    Sinon le gros truc avec IND=VIROUT là je pige pas trop. Probable que c'est un truc en plus (je vois qu'il y a création du rep dest s'il n'existe pas) mais qui est HS (la demande initiale est juste de la copie en remplaçant automatiquement l'extension => philisophie Linux: les autres problèmes se traitent en amont)

    Bon, voici ce que je propose, en considérant que varA et varB sont 2 variables contenant le répertoire A et B (pour le problème de Nicolas avec ses répertoires dans des variables)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/sh
    ls "$varA" |while read f
    do
        dest=`echo "$f" |sed -e "s/\.txt$/.tmp/"`
        cp "$varA/$f" "$varB/$dest"
    done
    Probable qu'on puisse enlever le dest=... et remplacer cp "$varA/$f" "$varB/$dest" par cp "$varA/$f" "$varB/${f%%.*}.tmp" mais comme je sais moins (en fait pas) utiliser "%%", je peux pas dire que ça marchera sans avoir testé...

  7. #7
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 30
    Points : 14
    Points
    14
    Par défaut
    Merci à tous!


    N_BaH -> sympa le petit "menu mode choix", ça je le stocke dans un coin ça peut toujour servir
    (d'ailleurs le début également pour d'autres trucs)


    Sve@r -> effectivement le test sur IND=VIROUT dans le cas précis de ma question à la base était hors propos (mais évidemment ça me sert en fait)

    ->pour les prochaines questions, m'efforcerait de bien cibler les bouts de codes qui sont en rapport avec la question.


    A+

    Nico

Discussions similaires

  1. renommer fichier sans modif extension
    Par tintin3158 dans le forum Langage
    Réponses: 5
    Dernier message: 06/01/2014, 14h39
  2. Exécuter un fichier sans avoir son nom
    Par fiofiotte dans le forum C
    Réponses: 2
    Dernier message: 02/12/2010, 16h50
  3. fichier sans connaitre le nom
    Par modjo dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/12/2008, 10h45
  4. Comment ouvrir un fichier sans connaitre son nom
    Par APoLLoN1234 dans le forum C++
    Réponses: 8
    Dernier message: 10/09/2006, 19h04
  5. Réponses: 6
    Dernier message: 28/09/2005, 15h15

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