• [^] # Re: pistes

    Posté par (site web personnel, Mastodon) . En réponse au message Problème sur enchainement de commandes find et rsync. Évalué à 2. Dernière modification le 11 novembre 2022 à 19:07.

    echo $SHELL renvoit /bin/sh

    Arf, on (en tout cas moi) a(i) pensé que tu utilisais bash, mais c'est visiblement un autre shell limité au vu de ce que tu nous montres.

    le massage ci dessous

    BusyBox v1.01 (2013年04月25日-18:11+0000) multi-call binary

    OK, ton shell est un dérivé du ash implémenté dans BusyBox.
    J'aurais pourtant juré qu'il connait la syntaxe $(...) ; à moins que ce soit parce-que c'est une version pas à jour... (les dernières stables sont 1.34.1 et 1.33.2 de septembre et novembre 2021 et il y a eu beaucoup de corrections de ash depuis la version 1.01...)

    J'arrive à stocker les résultats de la commande suivante dans un fichier liste.txt dans lequel la liste des fichiers à copier est correcte mais je ne parviens pas via Rsync à ce qu'il reprenne le contenu de cette liste qui pourrait être une solution.

    /opt/bin/find . -maxdepth 1 -type d -name "22_11_*" -exec /opt/bin/find {} -name "7964.vce" > liste.txt \;

    Une solution un peu crade serait de boucler sur les lignes du fichier

    while IFS= read -r line <&3; do
     rsync -aR "$line" "/share/data2_export/7964/"
    done 3< "liste.txt"

    Entre temps j'ai essayé avec print0 et xargs -0 sans succès, je dois mal m'y prendre ou alors la limitation du bash fait que ca ne marche pas , j'ai essayé la commande suivante et d'autres variantes :
    /opt/bin/find . -maxdepth 1 -type d -name "22_11_*" -exec /opt/bin/find {} -name "7964*.vce" -print0 \; | xargs -0 rsync -aR "/share/data2_export/7964/"

    Le souci ici n'est pas au niveau du shell :) xargs balance les lignes en argument de la commande ...donc les ajoute à la fin, alors que, contrairement à ls et autres commandes simples auxquelles cela correspond, rsync les veut avant la fin (le dernier argument étant la destination.) Mais xargs a prévu le coup :

    /opt/bin/find . -maxdepth 1 -type d -name "22_11_*" -exec /opt/bin/find {} -name "7964*.vce" -print0 \; |
     xargs -0 -I ICI rsync -aR ICI "/share/data2_export/7964/"

    C'est toi qui choisi la chaine de marquage (j'ai mis ICI) de sorte que ce ne soit pas en conflit avec le reste de la commande, et tu indiques à xargs par l'option -I que c'est à l'emplacement de cette chaîne qu'il faut poser les arguments et non à la fin. ;)

    "It is seldom that liberty of any kind is lost all at once." ― David Hume