Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 20/01/2010, à 21:13

Rizzen Virnn

[bash] conversion de fichier de façon récursive

Bonjour,

j'aimerais faire des conversions de mes fichiers video en série.
Un exemple vaut un long discours

dossier1/
    dossier11/
       fichier1.avi
    fichier2.avi
    fichier3.txt
    fichier4.avi
dossier2/
    fichier5.odt
    fichier6.ogg
fichier7.avi

devrait créer à coté un dossier convert/ contenant

convert/
    dossier1/
        dossier11/
            fichier1.avi
        fichier2.avi
        fichier4.avi
    fichier7.avi
dossier1/
...

pour lister les fichiers j'ai déjà

for NAME in *.avi;
do
    mencoder "$NAME" ...
done

mais j'ai un peu du mal avec les sous-dossiers et les chemins

merci

edit : aaah peut être que je devrais regarder du coté de "find -name *.avi" mais je n'arrive pas à séparer ligne par ligne après

Dernière modification par Rizzen Virnn (Le 20/01/2010, à 21:46)


Ubuntu 12.04 32bit - Archlinux 64 bit
HP Pavilion dv6790eb
Blog

Hors ligne

#2 Le 20/01/2010, à 21:47

heuuuuu

Re : [bash] conversion de fichier de façon récursive

Je pense que le mieux est de faire une copie de tout le répertoir dans le repertoir convret, puis une fonction recursive

function f
for i in `ls`
do
  if [ -d $i ] #test pour voir si il s'agit d'un repertoir
  then
    pushd $i
    f
    popd
  else
    mencoder $i
  fi
done

pas testé par vérifié... mais l'idée est là...


Quand les avions en papier ne partent plus au vent
On se dit que l'bon temps passe finalement...
...comme une étoile filante
http://forum.ubuntu-fr.org/viewtopic.php?id=139410

Hors ligne

#3 Le 20/01/2010, à 22:00

Rizzen Virnn

Re : [bash] conversion de fichier de façon récursive

merci je ne connaissais pas pushd et popd
par contre "for i in ls" me compte un fichier avec un espace comme deux fichiers


Ubuntu 12.04 32bit - Archlinux 64 bit
HP Pavilion dv6790eb
Blog

Hors ligne

#4 Le 20/01/2010, à 22:08

heuuuuu

Re : [bash] conversion de fichier de façon récursive

Rizzen Virnn a écrit :

merci je ne connaissais pas pushd et popd
par contre "for i in ls" me compte un fichier avec un espace comme deux fichiers

Effectivement, j'oublie toujours ce problème, la solution est d'utiliser while read il me semble...


Quand les avions en papier ne partent plus au vent
On se dit que l'bon temps passe finalement...
...comme une étoile filante
http://forum.ubuntu-fr.org/viewtopic.php?id=139410

Hors ligne

#5 Le 20/01/2010, à 22:22

francoisp31

Re : [bash] conversion de fichier de façon récursive

et surtout ${i} au lieu de $i en meme temps


Que les puces d'un millier de chiens galleux infeste le cul de celui qui osera vous gacher ne serai ce
qu'une seule journée de votre vie et que les bras lui soient trop court pour qu'il puisse se le gratter.

Hors ligne

#6 Le 20/01/2010, à 22:45

sputnick

Re : [bash] conversion de fichier de façon récursive

for i in $(ls) ca n'existe pas en programmation shell.

CF-> http://partmaps.org/era/unix/award.html#ls

Voici la solution :
find dossier1 -type -f -iname '*.avi' -exec mencoder <options> {} +

Pour ce qui est de ${i} au lieu de $i, c'est inexact. Les {} sont necessaires uniquement quand le nom de la variable peux etre perturbé par des caracteres adjacents. Par exemple la variable foo :

$ foo=123456
$ echo $foobar

$ echo ${foo}bar
123456

Le bon choix c'est toujours des variables avec des quotes doubles pour eviter le word-spliting.

De la bonne doc :

http://bash-hackers.org/wiki/doku.php/syntax/words http://www.grymoire.com/Unix/Quote.html

Dernière modification par sputnick (Le 20/01/2010, à 22:51)


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#7 Le 20/01/2010, à 22:48

Totor

Re : [bash] conversion de fichier de façon récursive

Bonsoir,
D'après l'exemple, le fichier de sortie conserve le même nom. Donc voilà qui devrait suffir :

mkdir -p convert
find . -type f -iname "*.avi" -exec mencoder {} -o convert/{} \;

Reste à faire : rajouter les options qui vont bien

EDIT : sputnick est passé par là entre 2 wink

Dernière modification par Totor (Le 20/01/2010, à 22:49)


-- Lucid Lynx --

Hors ligne

#8 Le 20/01/2010, à 22:50

Totor

Re : [bash] conversion de fichier de façon récursive

sputnick a écrit :

for i in $(ls) ca n'existe pas en programmation shell.

Malheureusement, on le voit trop souvent (ainsi que sa variante ls | while read ...)


-- Lucid Lynx --

Hors ligne

#9 Le 20/01/2010, à 22:58

nesthib

Re : [bash] conversion de fichier de façon récursive

bon grillé par Totor

edit : et par sputnick

j'étais en train de chercher comment faire une substitution dans le {} du exec de find, si quelqu'un a une solution simple et jolie

Dernière modification par nesthib (Le 20/01/2010, à 23:00)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#10 Le 20/01/2010, à 23:00

Rizzen Virnn

Re : [bash] conversion de fichier de façon récursive

et le mencoder, il crée les sous-dossiers dans convert ?
en cherchant j'avais pondu ça mais je sais pas si c'est très correcte (euuuh je fais un "| while read", c'est pas bien ?)

find . | while read f
do
    if [[ "$f" == ./convert* ]]; then true
    else
        if [ -d "$f" ]
        then
            if test ! -d "convert/$f"
            then
                mkdir "convert/$f"
            fi
        else
            if [[ "$f" == *.avi ]]
            then
                if test ! -e "convert/${f%avi}flv"
                then
                    mencoder "$f" -o "convert/${f%avi}flv" ...
                fi
            fi
        fi
    fi
done

bon faut savoir aussi que mon mencoder il aura plein d'options
je compte convertir les avi en flv, je sais pas si c'est possible avec votre commande

parce que un soucis aussi est si je rajoute un fichier dans un dossier, j'aimerais que en relançant le script, il ne s'occupe que de la vidéo ajoutée et ne me reconvertisse pas tout encore une fois

Dernière modification par Rizzen Virnn (Le 20/01/2010, à 23:13)


Ubuntu 12.04 32bit - Archlinux 64 bit
HP Pavilion dv6790eb
Blog

Hors ligne

#11 Le 20/01/2010, à 23:05

sputnick

Re : [bash] conversion de fichier de façon récursive

Pourquoi ne pas apprendre les bonnes méthodes dès le début au lieu de perdre son temps à apprendre des trucs biaisés ? Ca reste un mystère. Enfin si, des mauvaises docs trouvées ci et là sur le net hmm


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#12 Le 20/01/2010, à 23:10

sputnick

Re : [bash] conversion de fichier de façon récursive

find dossier1 -type f -iname '*.avi' -exec bash -c 'mencoder "$1" -o "${1%avi}flv"' -- {} \;

Edit: changé -type -f en -type f

Dernière modification par sputnick (Le 20/01/2010, à 23:41)


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#13 Le 20/01/2010, à 23:31

nesthib

Re : [bash] conversion de fichier de façon récursive

c'est -type f pas -f wink


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#14 Le 20/01/2010, à 23:39

sputnick

Re : [bash] conversion de fichier de façon récursive

Ooops, oui, pas testé wink "Typo" comme on dit en Anglais.


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#15 Le 21/01/2010, à 09:01

heuuuuu

Re : [bash] conversion de fichier de façon récursive

sputnick a écrit :

for i in $(ls) ca n'existe pas en programmation shell.

CF-> http://partmaps.org/era/unix/award.html#ls

:$ Merci pour le lien, et désolé pour les bêtises dites.


Quand les avions en papier ne partent plus au vent
On se dit que l'bon temps passe finalement...
...comme une étoile filante
http://forum.ubuntu-fr.org/viewtopic.php?id=139410

Hors ligne