OVH Cloud OVH Cloud

appliquer une commande à une série de fichiers

25 réponses
Avatar
miterrandir
Bonjour

J'ai une liste de fichiers contenus dans un répertoire auxquels je souhaite
passer une commande.

Exemple :

$ ffmpeg -i nom_aleatoire.flv nom_aleatoire.avi
$ ffmpeg -i nom_aleatoire2.flv nom_aleatoire2.avi
[...]

La commande converti le fichier flv existant en un fichier avi qu'elle créé.

Je cherche une petite recette pour automatiser ça svp. Dans le genre
convertir tous les fichiers flv en avi, vec le même nom..
merci d'avance.

10 réponses

1 2 3
Avatar
Alain Ketterlin
Thierry PINELLI writes:

Juste pour varier un peu des scripts shells, avec gnu make (on peut aussi
avec d'autres versions, mais l'obtention de LISTAVI a une syntaxe
différente) :



(au fait, GNU make preconise d'utiliser des regles de la forme

%.avi: %.flv

et pas .flv.avi, ce qui permet aussi de se passer de SUFFIXES)

je viens de le suggerer.
il est vrai que beaucoup de personnes pensent que cela ne sert qu'à
compiler :)


En l'occurrence make est fait pour tenir a jour un ensemble de
fichiers dependant d'autres fichiers, et s'assurer de tout bien
reconstruire en cas de modif. Je ne vois pas ce qui vous laisse penser
que les fichiers "sources" seront modifiés ici...

Cela dit, chacun son jouet prefere. La parole est aux amateurs de:
- find
- awk
- perl
- ls ... | sed ... | sh
- glob(3), fork(2), exec(2)
etc.

-- Alain.


Avatar
Thierry PINELLI
Alain Ketterlin wrote:

for f in *.flv; do
whatever $f $(dirname $f)/$(basename $f .flv).avi
done

C'est pour bash. Aucune idée comment ça se porte sous d'autres shells.


il manque un ";" quelque part

Avatar
Thierry PINELLI
Alain Ketterlin wrote:

En l'occurrence make est fait pour tenir a jour un ensemble de
fichiers dependant d'autres fichiers, et s'assurer de tout bien
reconstruire en cas de modif. Je ne vois pas ce qui vous laisse penser
que les fichiers "sources" seront modifiés ici...


les fichiers cibles ne seront pas recréés :)

c'est le but recherché

Avatar
Thierry PINELLI
Alain Ketterlin wrote:

En l'occurrence make est fait pour tenir a jour un ensemble de
fichiers dependant d'autres fichiers, et s'assurer de tout bien
reconstruire en cas de modif. Je ne vois pas ce qui vous laisse penser
que les fichiers "sources" seront modifiés ici...


un simple changement de nom est une modification.
un ajout de fichier est également une modification

make en tiendra compte une seule fois
et si c'est le foutoir dans le répertoire un make clean
fera le ménage

le fait que tu utilises le mot "modification" du fichier montre bien
que dans ton esprit make de sert qu'à invoquer un quelconque compilateur C

Avatar
Alain Ketterlin
Thierry PINELLI writes:

for f in *.flv; do
whatever $f $(dirname $f)/$(basename $f .flv).avi
done
C'est pour bash. Aucune idée comment ça se porte sous d'autres
shells.


il manque un ";" quelque part


Non.

-- Alain.


Avatar
Alain Ketterlin
Thierry PINELLI writes:

En l'occurrence make est fait pour tenir a jour un ensemble de
fichiers dependant d'autres fichiers, et s'assurer de tout bien
reconstruire en cas de modif. Je ne vois pas ce qui vous laisse penser
que les fichiers "sources" seront modifiés ici...


les fichiers cibles ne seront pas recréés :)

c'est le but recherché


Donc ton makefile servira une fois.

-- Alain.


Avatar
Alain Ketterlin
Thierry PINELLI writes:

Alain Ketterlin wrote:

En l'occurrence make est fait pour tenir a jour un ensemble de
fichiers dependant d'autres fichiers, et s'assurer de tout bien
reconstruire en cas de modif. Je ne vois pas ce qui vous laisse penser
que les fichiers "sources" seront modifiés ici...


un simple changement de nom est une modification.
un ajout de fichier est également une modification


Pour make, les deux sont identiques.

make en tiendra compte une seule fois
et si c'est le foutoir dans le répertoire un make clean
fera le ménage


A condition d'avoir ecrit la regle dans le makefile.

le fait que tu utilises le mot "modification" du fichier montre bien
que dans ton esprit make de sert qu'à invoquer un quelconque
compilateur C


Ce n'est pas moi qui parle de modification, c'est make qui se base
dessus. Et c'est toi qui ramene make sur une question ou, à mon avis,
il n'est ni le plus adapté, ni le plus facile à utiliser pour une
operation à faire manifestement une seule fois. Enfin, je ne vois pas
ce que la compilation C vient faire là-dedans, et surtout je ne vois
pas en quoi modifier un fichier se restreint à la compilation de
fichier C. Si tu viens de découvrir la portée de make, tant mieux pour
toi. Ca ne veut pas dire qu'il faut l'utiliser à tort et à travers, en
particulier quand le shell fait bien le boulot.

-- Alain.


Avatar
Thierry PINELLI
Alain Ketterlin wrote:
Thierry PINELLI writes:

En l'occurrence make est fait pour tenir a jour un ensemble de
fichiers dependant d'autres fichiers, et s'assurer de tout bien
reconstruire en cas de modif. Je ne vois pas ce qui vous laisse penser
que les fichiers "sources" seront modifiés ici...
les fichiers cibles ne seront pas recréés :)


c'est le but recherché




Donc ton makefile servira une fois.


non



Avatar
Thierry PINELLI
Alain Ketterlin wrote:

A condition d'avoir ecrit la regle dans le makefile.


sans blague ?

Avatar
Thierry PINELLI
Alain Ketterlin wrote:

for f in *.flv; do
whatever $f $(dirname $f)/$(basename $f .flv).avi


il manque un ";" quelque part



Non.



"help for"

for: for NAME [in WORDS ... ;] do COMMANDS; done
The `for' loop executes a sequence of commands for each member in a


c'est pas moi qui le dit



1 2 3