Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

find et xargs

6 réponses
Avatar
Antoine
Salut,

Je voudrais exécuter une commande sur des fichiers d'un répertoire, 5
par 5 :
Je pensais faire ceci:
$ find . | head -n 10 | tail -n 5 | xargs -i"X" echo convert X
+append fichier01.jpg
convert ./00795.jpg +append fichier01.jpg
convert ./00954.jpg +append fichier01.jpg
convert ./01113.jpg +append fichier01.jpg
convert ./01272.jpg +append fichier01.jpg
convert ./01431.jpg +append fichier01.jpg

mais apparemment les fichiers ne sont vus que un par un par xargs.
Je voudrais avoir la ligne de commande:
$ convert ./00795.jpg [.. jusque ..] ./01431.jpg +append
fichier01.jpg

Il y a bien l'option -l5
$ find . | xargs -l5 echo "<"
< . ./00000.jpg ./00159.jpg ./00318.jpg ./00477.jpg
< ./00636.jpg ./00795.jpg ./00954.jpg ./01113.jpg ./01272.jpg
< ./01431.jpg ./01590.jpg ./01749.jpg ./01908.jpg ./02067.jpg
< ./02226.jpg ./02385.jpg ./02544.jpg ./02703.jpg ./02862.jpg
< ./03021.jpg ./03180.jpg ./03339.jpg ./03498.jpg ./03657.jpg
< ./03816.jpg
mais apparemment elle n'est pas compatible avec l'option dont j'ai
absolument besoin: -i"X" Implique -x et -l 1.
D'ailleurs dans cet exemple, pourquoi n'ai je pas 5 lignes de 5
arguments ?

Alors si vous savez comment faire, ça m'intéresse.
Antoine

6 réponses

Avatar
JustMe
Antoine a écrit
Salut,

Je voudrais exécuter une commande sur des fichiers d'un répertoire, 5
par 5 :
Je pensais faire ceci:
$ find . | head -n 10 | tail -n 5 | xargs -i"X" echo convert X
+append fichier01.jpg
convert ./00795.jpg +append fichier01.jpg
convert ./00954.jpg +append fichier01.jpg
convert ./01113.jpg +append fichier01.jpg
convert ./01272.jpg +append fichier01.jpg
convert ./01431.jpg +append fichier01.jpg

mais apparemment les fichiers ne sont vus que un par un par xargs.
Je voudrais avoir la ligne de commande:
$ convert ./00795.jpg [.. jusque ..] ./01431.jpg +append
fichier01.jpg


bah ... | xargs -i"X" echo convert X X X X X +append fichier01.jpg

mais ca marchera pas pour le dernier "lot" si moins de 5 args


Il y a bien l'option -l5
$ find . | xargs -l5 echo "<"
< . ./00000.jpg ./00159.jpg ./00318.jpg ./00477.jpg
< ./00636.jpg ./00795.jpg ./00954.jpg ./01113.jpg ./01272.jpg
< ./01431.jpg ./01590.jpg ./01749.jpg ./01908.jpg ./02067.jpg
< ./02226.jpg ./02385.jpg ./02544.jpg ./02703.jpg ./02862.jpg
< ./03021.jpg ./03180.jpg ./03339.jpg ./03498.jpg ./03657.jpg
< ./03816.jpg
mais apparemment elle n'est pas compatible avec l'option dont j'ai
absolument besoin: -i"X" Implique -x et -l 1.
D'ailleurs dans cet exemple, pourquoi n'ai je pas 5 lignes de 5
arguments ?


parce que ton find renvoie aussi "." : le rep courant

Pour eviter ca : find . -type f

et il faudra que t'ajoutes aussi ! -name "fichier.*jpg" pour eviter de
reprendre tes fichiers nouvellement crees


Alors si vous savez comment faire, ça m'intéresse.
Antoine


Avatar
lhabert
Antoine :

Je pensais faire ceci:
$ find . | head -n 10 | tail -n 5 | xargs -i"X" echo convert X
+append fichier01.jpg


Là, tu ne gardes que les lignes de 6 à 10, et tu les passes en argument à
xargs.

Une solution bidouillesque :

find . -print0 | xargs -0 sh -c
'plim () { convert "$@" +append fichier01.jpg; }
while test "$#" -gt 4; do
plim "$1" "$2" "$3" "$4" "$5"
shift 5
done
if test "$#" -gt 0; then plim "$@"; fi
' ploum

Avatar
lhabert
Antoine :

Je pensais faire ceci:
$ find . | head -n 10 | tail -n 5 | xargs -i"X" echo convert X
+append fichier01.jpg


Là, tu ne gardes que les lignes de 6 à 10, et tu les passes en argument à
xargs.

Une solution bidouillesque :

find . -type f -print0 | xargs -0 sh -c
'plim () { convert "$@" +append fichier01.jpg; }
while test "$#" -gt 4; do
plim "$1" "$2" "$3" "$4" "$5"
shift 5
done
if test "$#" -gt 0; then plim "$@"; fi
' ploum

Avatar
lhabert
JustMe :

bah ... | xargs -i"X" echo convert X X X X X +append fichier01.jpg


Non, ça recopie cinq fois le même argument.

Avatar
JustMe
Luc Habert a écrit
JustMe :

bah ... | xargs -i"X" echo convert X X X X X +append fichier01.jpg


Non, ça recopie cinq fois le même argument.


oups... je fus trop prompt ;-)


Avatar
JustMe
Luc Habert a écrit
Antoine :

Je pensais faire ceci:
$ find . | head -n 10 | tail -n 5 | xargs -i"X" echo convert X
+append fichier01.jpg


Là, tu ne gardes que les lignes de 6 à 10, et tu les passes en argument à
xargs.

Une solution bidouillesque :

find . -type f -print0 | xargs -0 sh -c
'plim () { convert "$@" +append fichier01.jpg; }
while test "$#" -gt 4; do
plim "$1" "$2" "$3" "$4" "$5"
shift 5
done
if test "$#" -gt 0; then plim "$@"; fi
' ploum


marchera pas : tu vas te reprendre les fichier01 dans la tronche : il
faut les exclure du find