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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 30
    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 659
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 659
    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.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre chevronné
    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
    Par défaut
    je pense qu'il veut seulement déplacer les fichier d'aujourd'hui sinon il s'embeterait pas ainsi

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 30
    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 659
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 659
    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
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    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é...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

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

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