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 :

Parcourir une arborescence puis traitement sur fichier


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Par défaut Parcourir une arborescence puis traitement sur fichier
    Bonjour,
    je voudrais parcourrir une arborescence de répertoire et sous répertoire, et pour chacun des fichiers de l'arborescence je voudrais créer un lien symbolique sur ce fichier, dans un répertoire "lien", en le nommant de la manière suivante:
    "Fichier_".(NombreAleatoire de 0 à1000000).(extension du fichier d'origine).

    -sans dépacer/supprimer les fichiers d'origine.
    -en mettant tous les liens créés dans un seul et même répertoire.
    -(et si possible mais pas indispensable) en ayant le même nombre de digit pour le nombre aléatoire.

    Exemple:
    C:/arbo/rep1/rep11/toto.jpeg
    C:/arbo/rep2/rep21/rep211/titi.Gif
    C:/arbo/rep3/tata.txt
    
    ==> C:/lien/Fichier_138464.jpeg
    ==> C:/lien/Fichier_751482.Gif
    ==> C:/lien/Fichier_276415.txt

    je suis débutant et en parcourant le forum j'ai trouvé des bouts de scripts et comandes: "find", "ln -s","basename (pour récupérer le nom du fichier)"
    mais
    -Comment récupérer l'extension du fichier?
    -Comment générer et concaténer un nombre aléatoire?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/sh
    for i in `find <chemin> -type f`
    do
     target_dir=`lien`
     j=(NombreAleatoire de 0 à1000000) ????
     k=(extension du fichier d'origine) ????
     ln - s $i ./$target_dir/`Fichier_'. $j.$k
    done
    exit0
    Merci d'avance de votre aide.
    Cordialement,

  2. #2
    Membre éprouvé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Par défaut
    Salut,
    Si tu n'es pas contre bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/bin/bash
    shopt -s globstar
    for fic in **/*.*
    do
       [[ ! -f $fic ]] && continue
       ext=${fic##*.}
       i=0
       while [[ -L lien/Fichier_.$nb.$ext || $i = 0 ]]
       do
          nb=$(printf '%07d' $(((RANDOM%1000)*(RANDOM%1000))))
          ((i++))
       done
       ln -s "$fic" "lien/Fichier_.$nb.$ext"
    done

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Bonjour Postmortem, et bienvenue.

    il est préférable de mettre systématiquement les variables entre quillemets (surtout dans les tests).

    une option pour éviter la création d'un sous-shell :printf -v nb '%07d' $(((RANDOM%1000)*(RANDOM%1000))).

    les doubles-crochets ne sont pas nécessaires ici : des crochets simples pour des tests simples.

    trois fois rien, quoi
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour Postmortem, et bienvenue.
    Merci ! Et merci pour tous tes messages car j'ai appris plein de trucs en les lisant (et ceux d'autres membres réguliers).

    Citation Envoyé par N_BaH Voir le message
    il est préférable de mettre systématiquement les variables entre quillemets (surtout dans les tests).

    une option pour éviter la création d'un sous-shell :printf -v nb '%07d' $(((RANDOM%1000)*(RANDOM%1000))).

    les doubles-crochets ne sont pas nécessaires ici : des crochets simples pour des tests simples.

    trois fois rien, quoi
    J'avais jamais fait gaffe que printf acceptait l'option -v, je le note, merci !

    Pour les tests, je les fais systématiquement entre [[ ]] (sauf dans certains cas), question d'habitude... Et du coup, les guillemets ne sont pas nécessaires, même si la valeur de la variable contient une espace (pas de découpage en mots après les expansions quand on est entre [[ ]] il me semble). Après, mieux vaut en mettre trop que pas assez !

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Par défaut Parcourir une arborescence puis traitement sur fichier
    Bonjour et merci bcp pour votre réponse et votre aide!
    et désolé si mes questions sont basiques, je suis gros débutant!

    @postmortem: merci pour le bout de script qui est très clair.

    je voudrais le faire tourner sur mon NAS (dlink325) avec un linux 2.6.22.18 installé.
    J'ai l'impression que les comandes shopt, globstar?, RANDOM ne sont pas reconnues.
    Est-ce possible?
    Ai-je une version de bash trop ancienne?
    dois-je/puis-je la mettre à jour? comment?
    le cas échéanr puis-je faire l'équivalent en sh?

    merci, a+

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    si shopt n'est pas reconnu, alors soit bash n'est pas installé, soit sh n'est pas un lien vers bash.


    pour générer des nombres aléatoires :
    existe-t-il un fichier /dev/urandom ?
    awk est-il disponible ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/02/2023, 18h27
  2. Cherche une commande shell/bash pour traitement sur fichier
    Par breizho35 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 26/02/2015, 11h18
  3. Parcourir une arborescence de fichiers sous Unix
    Par dim_italia dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 04/12/2007, 15h35
  4. Réponses: 3
    Dernier message: 16/03/2007, 18h04
  5. Parcourir une arborescence et comparer ses fichiers
    Par Doom2Darkness dans le forum Linux
    Réponses: 6
    Dernier message: 04/01/2007, 13h55

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