cerhu > linux.debian.user.french

ptilou (22/05/2020, 06h10)
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
Basile Starynkevitch (22/05/2020, 07h00)
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.
Marc Chantreux (22/05/2020, 08h30)
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
Marc Chantreux (22/05/2020, 08h50)
> 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
Discussions similaires
répertoire courant

Créer un sous-répertoire dans le répertoire courant

Répertoire courant

repertoire courant ou... repertoire courant ?


Fuseau horaire GMT +2. Il est actuellement 00h44. | Privacy Policy