|
|
|
Slt,
#!/bin/bash function f_image-fusion { ffmpeg -i $0 image%d.jpg } { find ./ -iname \*.mp4 echo "EOF" } | { while true; do read -r i test "$i" = "EOF" && break f_image-fusion "$i" done } Je fais cela sur dés répertoire, et j?aurai aimer rediriger la sortie de la fonction f_image-fusion sur un autre répertoire que le courant, sans avoir à imbriquer une autre boucle est-ce que c?est possible ? Et comment ? Merci ? Ptilou |
|
|
|
On 5/22/20 5:59 AM, ptilou wrote:
[..] > read -r i > test "$i" = "EOF" && break > f_image-fusion "$i" > done > } > Je fais cela sur dés répertoire, et j?aurai aimer rediriger la sortie de la fonction f_image-fusion sur un autre répertoire que le courant, sans avoir à imbriquer une autre boucle est-ce que c?est possible ? > Merci Il convient de lire (en anglais) /Advanced Linux Programming/ <http://www.makelinux.net/alp/> puis syscalls(2) <http://man7.org/linux/man-pages/man2/syscalls.2.html> puis execve(2) <http://man7.org/linux/man-pages/man2/execve.2.html> puis fork(2) <http://man7.org/linux/man-pages/man2/fork.2.html> puis credentials(7) <http://man7.org/linux/man-pages/man7/credentials.7.html> puis bash(1) <http://man7.org/linux/man-pages/man1/bash.1.html> Le répertoire courant (voir getcwd(3) <http://man7.org/linux/man-pages/man3/getcwd.3.html> ...) est propre à chaque processus <https://fr.wikipedia.org/wiki/Processus_(informatique)>. En particulier à celui créé par l?exécution de ton script ou bien à celui exécutant le shell de ton terminal. Une possibilité serait de complexifier ton script (par exemple avec getopt(1) <http://man7.org/linux/man-pages/man1/getopt.1.html> ...) pour y ajouter une option qui modifie le répertoire courant du shell exécutant ton script. Une suggestion serait de changer de langage de script, et prendre par exemple Guile <https://www.gnu.org/software/guile/> ou Python <https://www.python.org/> ou Lua <https://www.lua.org/>. Je les trouve tous plus lisibles et permettant des scripts plus concis et plus maintenables qu'avec bash <https://www.gnu.org/software/bash/> (ou même zsh <zsh.org>). Bien évidemment, Guile comme Python comme Lua sont packagés par Debian. |
|
|
salut,
* read renvoie faux quand il ne peut plus lire donc { find ./ -iname \*.mp4 echo "EOF" } | { while true; do read -r i test "$i" = "EOF" && break f_image-fusion "$i" } s'écrit plus traditionelement { find ./ -iname \*.mp4 echo "EOF" } | { while IFS= read -r i; do f_image-fusion "$i" done } mais les boucles while sur des read en shell c'est pas très efficace: l'outils posix pour faire ce que tu veux faire est xargs find ./ -iname \*.mp4 -print0 |xargs -IX ffmpeg -i X image%d.jpg > Je fais cela sur dés répertoire, et j?aurai aimer rediriger la sortie de la fonction f_image-fusion sur un autre répertoire que le courant, sans avoir à imbriquer une autre boucle est-ce que c?est possible ? ce que je comprend c'est que tu veux que les images soient générées dans un autre répertoire que le répertoire courant. pour cela il te faut juste modifier le template du nom de fichier find ./ -iname \*.mp4 -print0 | xargs -0 -IX ffmpeg -i X /tmp/image%d.jpg si ton répertoire de destination est dépendant du répertoire dans lequel se trouve le mp4, il faut produire la liste des arguments de ffmpeg avec find et les passer à xargs. si j'ai compris correctement ton problème, ton script final est find tmp/born/ -type f -printf '%f\0%h/image%%d.jpg\0' | xargs -0 -n2 ffmpeg -i a+ marc |
|
|
> Une suggestion serait de changer de langage de script, et prendre par
> exemple Guile <https://www.gnu.org/software/guile/> ou Python > <https://www.python.org/> ou Lua <https://www.lua.org/>. je suis toujours consterné d'avoir à me tapper 300 lignes de python pour finalement me rendre compte que quelques lignes de shell aurait pu suffir. mon interpreteur préféré étant de loin zsh. toutefois quand je vois qu'il est possible d'écrire simplement les choses avec dash ou rc, je ne m'en prive pas (si bash est le plus utilisé, c'est aussi le plus inutile) le possède des commandes et concepts de haut niveau pour la manipulation des fichiers programmes dispo sur ta machine, permet d'appréender des concepts comme le parallèlisme, la composition, la modularité, les streams bien plus simplement que les autres langages, un interpreteur shell est léger et traine peu de dépendences... de plus si tu as besoin d'un langage de programmation au quotidien dans la vie d'un unixien c'est bien le shell. donc si il y a *un* langage a connaitre c'est le shell (et tous ses compagnons: awk, sed, bc selon tes besoins...) > plus lisibles et permettant des scripts plus concis et plus maintenables > qu'avec bash <https://www.gnu.org/software/bash/> (ou même zsh <zsh.org>). vraiment: tout dépend de ce que tu appelles lisible ... pour faire ce genre de taches, ta proposition me semble contre-productive. > Bien évidemment, Guile comme Python comme Lua sont packagés par Debian. et quitte à choisir un langage dynamique en 2020, je te conseile d'en apprendre un qui n'aie pas 25 de casseroles à trainer comme ces 3 là: [..]. et si raku est un peu trop frais pour toi: si je devais garder *un seul* langage dynamique des années 90, ce serait perl évidement. cordialement, marc |
|
Fuseau horaire GMT +2. Il est actuellement 00h48. | Privacy Policy
|