Forum Programmation.shell find, parallel et commandes imbriquées

Posté par .
Tags : aucun
1
2
avr.
2011

Bonjour,

je butte sur un problème qui semble bête mais que je n'arrive pas à contourner : pour lutter contre la corruption lente de mes vidéos & co (certaines deviennent violettes par moment), j'ai décidé de créer des fichiers par2 pour chacun des fichiers à protéger.

En bref, je balaye récursivement un répertoire avec find, j'utilise parallel pour accélérer le tout et j'appelle ainsi par2create.

Le problème, c'est que j'aimerais que les fichiers .par2 soient cachés, et j'aimerais le faire sans deuxième find. Donc je pense à ca :

find  `pwd` -type f  | parallel --progress -j 3 par2create -qq -r5 -n1 -- '`dirname '{}'`/.'{/}'.par2'  '{}' 
#devrait exécuter : par2create -qq -r5 -n1 -- /chemin/absolu/.video.avi.par2 /chemin/absolu/video.avi
#éxecute en fait  : par2create -qq -r5 -n1 -- ./.video.avi.par2             /chemin/absolu/video.avi

Malheur! On aurait pu espérer que dirname '{}' retourne le chemin absolu de {} mais ce gros malin, étant évalué au moment où je tape sur entrée, ne renvoie que "point" . Badaboum, tous les fichiers par2 se retrouvent dans le répertoire d'appel. J'ai plein de solutions bancales et pleines de double passes, mais rien de sympa et léger.

Passons sur le fait que parallel permette de manipuler l'argument {}, l'argument sans extension {.}, l'argument sans chemin {/} (basename) mais pas le chemin de l'argument (dirname)!

Une bonne âme saurait elle imbriquer une commande évaluée à posteriori? Merci d'avance!

  • # Fais un script

    Posté par (page perso) . Évalué à 2.

    Fais un script contenant ta commande, qui sera exécuté par parallel.

    DLFP >> PCInpact > Numerama >> LinuxFr.org

  • # Absolu / relatif

    Posté par (page perso) . Évalué à 3.

    Je me trompe peut-être, mais que tu ais le chemin absolu ou relatif, tu auras le même résultat. Le problème est que dirname n'est évalué qu'une seule fois.

    Je pense que j'utiliserais sed intercalé entre find et parallel. Quelque chose comme:

    sed 's/^(.*)$/\1.par2 \1/'
    

    Comme ça parallel reçoit deux chemins tout cuits. Je ne me suis pas penché sur parallel, mais je pense qu'il sait faire avec deux arguments.
    A améliorer pour gérer les noms contenant des espaces et compagnie.

    • [^] # Re: Absolu / relatif

      Posté par . Évalué à 2.

      Merci pour la piste, ca marche!

      find "`pwd`" -type f | grep -v par2 | sed -e 's:^\(.*/\)\(.*\):\1.\2.par2\;\1\2:g' | parallel -C "\;" par2create -qq -r5 -n1 -- {} 
      

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.