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 :

Lister des chemins de fichiers pour en faire des liens symboliques


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut Lister des chemins de fichiers pour en faire des liens symboliques
    Bonjour à tous,

    Alors je suis pas trop familier avec le bash enfin surtout la partie script du coup je viens vous demander un peu d'aide.

    Alors j'ai un dossier source dans lequel j'ai plein de sous dossiers et dans lesquels j'ai des fichiers qui portent l'extension .bd:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    path_source=/home/user/sources
    j'ai également un dossier de destination (là où je souhaite créer mes liens symboliques)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    link_path=/Myfolder/destination/link
    Voilà le bout de code que j'ai pondu !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #!/bin/bash
     
    path_source=/home/user/sources
    link_path=/Myfolder/destination/link
     
    for files in find $path_source -name *.db
    do
       ln -s $files $link_path
    done
    Dans un premier temps je fais une recherche de tout les fichiers *.db dans mon path_source, et ensuite je veux faire le lien symbolique grâce à ln -s

    Le soucis c'est que ça n'a pas l'air de fonctionner je n'ai aucun liens de créé et j'ai pas de messages d'erreurs !!!

    Une idée ?

    Merci d'avance pour votre aide.

  2. #2
    Membre régulier
    Homme Profil pro
    Expert Middleware
    Inscrit en
    Septembre 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Expert Middleware

    Informations forums :
    Inscription : Septembre 2006
    Messages : 75
    Points : 100
    Points
    100
    Par défaut
    Bonjour,

    alors pour moi deux petits soucis dans ton script.

    * Tu dois exécuter ton find dans un sous-shell afin d'avoir un résultat. Sinon actuellement il va traiter juste les mots.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for files in find $path_source -name *.db
    doit devenir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for files in $(find $path_source -name *.db)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for files in `find $path_source -name *.db`
    * Ensuite pour créer ton lien tu dois le nommer. Actuellement tous tes liens pointerons depuis /Myfolder/destination/link. Je pense que tu souhaites avoir quelquechose du genre /Myfolder/destination/link/lien1 /Myfolder/destination/link/lien2, ect ...

    Pour ca je ferais donc comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ln -s $files $link_path/$(basename $files)
    J'espère avoir été clair.

    Syberi@
    Quand on est mort, on ne sait pas qu’on est mort, c’est pour les autres que c’est difficile… Quand on est con, c’est pareil.

  3. #3
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    une solution plus directe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find "${path_source}/" -type f -name "*.db" -print0 | xargs -0 -I{} ln -s {} "${link_path}/"
    • for fichier in $(find ...) c'est très maladroit, on perd tout l'intérêt du find ou tout l'intérêt du for+globbing, selon le besoin c'est soit find | machin soit for fichier in ${path_source}/{*.db,*/*/*.db} par exemple
    • l'option -0 de xargs se marie avec le -print0 de find et permet de résister aux noms de fichiers avec des espaces ou autres

  4. #4
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par Syberi@ Voir le message
    Bonjour,

    alors pour moi deux petits soucis dans ton script.

    * Tu dois exécuter ton find dans un sous-shell afin d'avoir un résultat. Sinon actuellement il va traiter juste les mots.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for files in find $path_source -name *.db
    doit devenir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for files in $(find $path_source -name *.db)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for files in `find $path_source -name *.db`
    * Ensuite pour créer ton lien tu dois le nommer. Actuellement tous tes liens pointerons depuis /Myfolder/destination/link. Je pense que tu souhaites avoir quelquechose du genre /Myfolder/destination/link/lien1 /Myfolder/destination/link/lien2, ect ...

    Pour ca je ferais donc comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ln -s $files $link_path/$(basename $files)
    J'espère avoir été clair.

    Syberi@
    Merci pour ra réponse.

    Oui très clair et ça fonctionne merci pour les explications.

  5. #5
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    salut,

    une solution plus directe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find "${path_source}/" -type f -name "*.db" -print0 | xargs -0 -I{} ln -s {} "${link_path}/"
    • for fichier in $(find ...) c'est très maladroit, on perd tout l'intérêt du find ou tout l'intérêt du for+globbing, selon le besoin c'est soit find | machin soit for fichier in ${path_source}/{*.db,*/*/*.db} par exemple
    • l'option -0 de xargs se marie avec le -print0 de find et permet de résister aux noms de fichiers avec des espaces ou autres
    Merci pour ta réponse, cependant lorsque je l'essaie je n'obtiens rien.

    J'ai essayé de comprendre mais comme dis plus haut je ne suis pas un expert du bash, je l'utilise de temps en temps, du coup certaines notions me sont étrangères je vais donc éviter les questions bêtes .

    Par contre une question qui ne m'a pas l'air d'être bête : Pourquoi tu dis que for fichier in $(find ...) c'est maladroit, enfin tu l'expliques mais c'est souvent ce qui est utilisé. Un exemple j'utilise souvent for files in `ls lrt *.txt` est ce que c'est aussi maladroit de l'utiliser comme ça ?

    Encore merci

    En tout cas merci pour tes suggestions.

  6. #6
    Expert éminent sénior
    Avatar de Escapetiger
    Homme Profil pro
    Administrateur système Unix - Linux
    Inscrit en
    Juillet 2012
    Messages
    1 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur système Unix - Linux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 1 474
    Points : 11 042
    Points
    11 042
    Par défaut
    Bonjour,
    Citation Envoyé par Syberi@ Voir le message
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for files in `find $path_source -name *.db`
    Juste un point au passage concernant l'utilisation du caractère ` (Back-quote, apostrophe inversée ou accent grave, backtick ...) :

    Why is $(...) preferred over `...` (backticks) ?

    `...` is the legacy syntax required by only the very oldest of non-POSIX-compatible bourne-shells. There are several reasons to always prefer the $(...) syntax :
    Source: http://mywiki.wooledge.org/BashFAQ/082
    « Developpez.com est un groupe international de bénévoles dont la motivation est l'entraide au sens large » (incl. forums developpez.net)
    Club des professionnels en informatique

  7. #7
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Bonjour

    Par contre une question qui ne m'a pas l'air d'être bête : Pourquoi tu dis que for fichier in $(find ...) c'est maladroit, enfin tu l'expliques mais c'est souvent ce qui est utilisé. Un exemple j'utilise souvent for files in `ls lrt *.txt` est ce que c'est aussi maladroit de l'utiliser comme ça ?
    OUI !

    Déjà, certains te diront qu'ont utilise pas ls dans un script.
    Et puis mettre ça dans un for, c'est nul.

    mais c'est souvent ce qui est utilisé.
    Par qui ? Pas par ton prof, j'espère ?

    Why is $(...) preferred over `...` (backticks) ?
    Imaginons une ligne avec 4 backquotes. Lesquels sont ouvrants ? Lesquels sont fermants ?
    Rien que pour lever cette ambiguïté, il faut des $().
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    c'est souvent ce qui est utilisé
    par des personnes inexpérimentées.

    le problème vient de ce que for traite des mots (c'est-à-dire chaque élément d'une chaîne "coupée" par des espaces), et initie une boucle sur chacun de ces mots.

    c'est pourquoi je proscris l'emploi de substitution de commande avec for.
    ce qui se transforme vite en :
    ON N'UTILISE PAS ls DANS UN SCRIPT !!!*


    *
    Citation Envoyé par Flodelarab
    certains te diront qu'on n'utilise pas ls dans un script.
    gagné !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Bonjour
    Par qui ? Pas par ton prof, j'espère ?
    Non je suis ne suis pas élève programmeur je suis ingénieur en calcul de structures, disons que le code à mon niveau c'est pour m'éviter de répéter 100 fois la même chose.

    Bien que je ne suis pas "programmeur" si je dois faire des bouts de codes de temps en temps autant les faire biens.

    Du coup par quoi remplacerais tu for `ls -lrt *.txt` ?

  10. #10
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    lorsque je l'essaie je n'obtiens rien.
    c'est à dire ?

    la commande fonctionne normalement, c'est bien les extension .db que tu veux ? vérifie également tes variables path_source et link_path

    pour le reste pareil que Flodelarab et N_BaH, en résumé for truc in $(find) c'est comme croiser les effluves : c'est mal.

    et concernant la substitution de commande, pour illustrer on ne peut pas écrire quelque chose du genre machin $(truc $(bidule $(bouzin))) avec des backticks ``

    Edit:
    Citation Envoyé par nekcorp Voir le message
    Du coup par quoi remplacerais tu for `ls -lrt *.txt` ?
    question à l'envers :
    • si dans le lot tu as fichier avec des espaces.txt que donne ton for ?
    • de quoi as-tu besoin pour faire un ls -lrt, du owner ? du groupe ? de l'horodatage ? du tri ?
    • le cas du tri par horodatage est -à mon sens- la seule entorse qu'on puisse faire. la sortie de ls n'est pas considérée comme consistante d'un système à un autre, celle de find l'est

  11. #11
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    Du coup par quoi remplacerais tu for `ls -lrt *.txt` ?
    • Je n'ai pas testé la commande de Bufferbob mais j'aurais fait exactement comme lui (dans l'idée).
    • Dans les autres cas, comme on nous dit que "tout est fichier", j'aime bien manipuler des fichiers textes.
      Par exemple, la sortie de find est comme une liste dont chaque ligne est un nom de fichier.
      La sortie d'une commande est comme un fichier, la sortie d'une boucle est comme un fichier.
      Voilà pourquoi je m'intéresse particulièrement à grep/sed/awk/etc.


    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ find . -type f
    ./fichier_0.txt
    ./fichier_11231.txt
    ./fichier_12740.txt
    ./fichier_20013.txt
    ./fichier_22657.txt
    Si je veux récupérer le numéro de fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ find . -type f | sed 's/.*_//;s/.txt//'
    0
    11231
    12740
    20013
    22657
    Si je veux créer des fichier csv dont le nom contient ce numéro et dont le contenu est ce numéro:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ find . -type f | sed 's/.*_//;s/.txt//' | awk '{print $1>$1".csv";}'
    $ ls
    0.csv  11231.csv  12740.csv  20013.csv  22657.csv  fichier_0.txt  fichier_11231.txt  fichier_12740.txt  fichier_20013.txt  fichier_22657.txt  
    $ cat 11231.csv
    11231
    Et si je veux supprimer ces mêmes fichiers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ find . -name "*.txt" -type f | sed 's/.*_//;s/.txt/.csv/;'|xargs -ITT rm -f TT
    $ ls
    fichier_0.txt  fichier_11231.txt  fichier_12740.txt  fichier_20013.txt  fichier_22657.txt
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  12. #12
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    c'est à dire ?

    la commande fonctionne normalement, c'est bien les extension .db que tu veux ? vérifie également tes variables path_source et link_path
    C'est bon j'ai résolus le problème j'avais un soucis dans mon path_source


    Edit:
    question à l'envers :
    [*] si dans le lot tu as fichier avec des espaces.txt que donne ton for ?
    Cette nuance je la comprend et c'est vrai que l'on peut vite tomber sur des problèmes.

    [*] de quoi as-tu besoin pour faire un ls -lrt, du owner ? du groupe ? de l'horodatage ? du tri ?
    En fait j'ai juste besoin de lister ce qui est dans mon répertoire et filtrer si besoin.

    [*] le cas du tri par horodatage est -à mon sens- la seule entorse qu'on puisse faire. la sortie de ls n'est pas considérée comme consistante d'un système à un autre, celle de find l'est
    En gros tu dis que d'un linux à l'autre find fournira les mêmes résultats mais pas ls, du coup le script reste moins portable ?

  13. #13
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    • Je n'ai pas testé la commande de Bufferbob mais j'aurais fait exactement comme lui (dans l'idée).
    • Dans les autres cas, comme on nous dit que "tout est fichier", j'aime bien manipuler des fichiers textes.
      Par exemple, la sortie de find est comme une liste dont chaque ligne est un nom de fichier.
      La sortie d'une commande est comme un fichier, la sortie d'une boucle est comme un fichier.
      Voilà pourquoi je m'intéresse particulièrement à grep/sed/awk/etc.


    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ find . -type f
    ./fichier_0.txt
    ./fichier_11231.txt
    ./fichier_12740.txt
    ./fichier_20013.txt
    ./fichier_22657.txt
    Si je veux récupérer le numéro de fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ find . -type f | sed 's/.*_//;s/.txt//'
    0
    11231
    12740
    20013
    22657
    Si je veux créer des fichier csv dont le nom contient ce numéro et dont le contenu est ce numéro:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ find . -type f | sed 's/.*_//;s/.txt//' | awk '{print $1>$1".csv";}'
    $ ls
    0.csv  11231.csv  12740.csv  20013.csv  22657.csv  fichier_0.txt  fichier_11231.txt  fichier_12740.txt  fichier_20013.txt  fichier_22657.txt  
    $ cat 11231.csv
    11231
    Et si je veux supprimer ces mêmes fichiers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ find . -name "*.txt" -type f | sed 's/.*_//;s/.txt/.csv/;'|xargs -ITT rm -f TT
    $ ls
    fichier_0.txt  fichier_11231.txt  fichier_12740.txt  fichier_20013.txt  fichier_22657.txt
    Je comprend bien que vous maitrisez très bien le shell mais en ce qui me concerne je suis loin de tout comprendre.

    Ok pour le find c'est pas compliqué, le sed et les expressions régulières j'ai toujours buché dessus mais je le trouve très puissant par contre xargs je ne connais pas, je vais me renseigner dessus.

    En tout cas merci

  14. #14
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Le but n'était pas de comprendre les commandes, mais de voir que la sortie de find est un fichier texte, servant de liste, qui est passé à un autre outil, qui fait de même, en le passant à un troisième outil, etc.

    On manipule des "fichiers" contrairement au réflexe initial qui était de mettre les noms de fichiers dans une variable et faire une boucle sur cette variable comme on le ferait en C++, java, etc...
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  15. #15
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    salut,

    une solution plus directe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find "${path_source}/" -type f -name "*.db" -print0 | xargs -0 -I{} ln -s {} "${link_path}/"
    Euh... je maîtrise mal les options de "xargs"...

    Pourrais-tu expliquer pourquoi on ne pourrait pas faire directement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find "${path_source}/" -type f -name "*.db" -exec ln -s {} "${link_path}/" \;
    ou même, puisque la cible est un dossier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find "${path_source}/" -type f -name "*.db" -exec ln -s {} "${link_path}/" \+

  16. #16
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Euh... je maîtrise mal les options de "xargs"...
    rien de sorcier ici, -0 récupère la sortie de find -print0, avec un \0 comme délimiteur au lieu de \n
    quant à -I{} ça permet de substituer les arguments, à la find justement, sauf qu'un seul argument est considéré à la fois

    Pourrais-tu expliquer pourquoi (...)
    oui bien entendu, il se trouve qu'après délibérations (sur un salon irc où la discussion s'est invitée) j'étais probablement bourré

    tes solutions sont donc tout à fait pertinentes, particulièrement la dernière

  17. #17
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find "${path_source}/" -type f -name "*.db" -exec ln -s {} "${link_path}/" \;
    ou même, puisque la cible est un dossier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find "${path_source}/" -type f -name "*.db" -exec ln -s {} "${link_path}/" \+
    Citation Envoyé par BufferBob Voir le message
    tes solutions sont donc tout à fait pertinentes, particulièrement la dernière
    Euh... le message est trop ancien pour pouvoir être édité, mais je ne voudrais pas laisser une bourde à la postérité...

    Pour le find ... -exec ... \+, il faut impérativement que le \+ soit immédiatement précédé de {}, comme indiqué dans le man:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
         -exec utility [argument ...] ;
                 True if the program named utility returns a zero value as its exit status.  Optional arguments may be passed to the utility.  The expression must be terminated by a semicolon (``;'').  If you invoke find from a
                 shell you may need to quote the semicolon if the shell would otherwise treat it as a control operator.  If the string ``{}'' appears anywhere in the utility name or the arguments it is replaced by the pathname of
                 the current file.  Utility will be executed from the directory from which find was executed.  Utility and arguments are not subject to the further expansion of shell patterns and constructs.
    
         -exec utility [argument ...] {} +
                 Same as -exec, except that ``{}'' is replaced with as many pathnames as possible for each invocation of utility.  This behaviour is similar to that of xargs(1).
    Donc, seule la première proposition est valide.

    Encore désolé...

Discussions similaires

  1. un script pour Lister, Modifier, remplacer des noms de fichiers pour un upload?
    Par shadock0 dans le forum Shell et commandes POSIX
    Réponses: 2
    Dernier message: 27/09/2011, 21h47
  2. Réponses: 8
    Dernier message: 15/07/2008, 17h41
  3. [MySQL] extraire des mots concaténés ensemble pour en faire des liens
    Par oim dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 15/11/2007, 04h32
  4. Réponses: 4
    Dernier message: 28/08/2006, 14h47
  5. Faire des disquette d'archive pour apt avec mon lecteur zip ?
    Par narmataru dans le forum Administration système
    Réponses: 4
    Dernier message: 14/01/2005, 10h06

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