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

find et awk

11 réponses
Avatar
Stan
Bonjour,

j'aimerai reformater une liste de fichiers renvoyée
par find, dans l'esprit ça ressseblerai à ça :
> find / -name "*.txt" -exec echo {} | awk ' { print }' \;

évidemment, sous cette forme, ça ne marche pas.

Quelle est la forme canonique pour parvenir au bon résultat
( en passant par l'option -exec et non pas par un pipe après le find ) ?

Merci.

--
-Stan

10 réponses

1 2
Avatar
Marc Mezzarobba
find / -name "*.txt" -exec echo {} | awk ' { print }'  ;


Euh, c'est quoi la différence entre ça et la même chose en enlevant tout
le -exec ? À mois que « find [...] -exec sh -c '...' ; » ne réponde à ta
question ?

--
Marc Mezzarobba

Avatar
JustMe
Stan a écrit
Bonjour,

j'aimerai reformater une liste de fichiers renvoyée


Reformater ? Comment ?

par find, dans l'esprit ça ressseblerai à ça :
find / -name "*.txt" -exec echo {} | awk ' { print }' ;



Là je comprend rien ;-)


évidemment, sous cette forme, ça ne marche pas.


M'etonne pas :-D


Quelle est la forme canonique pour parvenir au bon résultat


C'est quoi le "bon resultat" pour toi ?

( en passant par l'option -exec et non pas par un pipe après le find ) ?

Merci.



Avatar
Olivier Miakinen

j'aimerai reformater une liste de fichiers renvoyée
par find, dans l'esprit ça ressseblerai à ça :
find / -name "*.txt" -exec echo {} | awk ' { print }' ;


évidemment, sous cette forme, ça ne marche pas.


Je suppose qu'il y a autre chose qu'un simple print dans le script awk,
mais que tu as simplifié l'exemple.

Bon, déjà, il faut terminer le -exec de la commande find (par ;) avant
de rediriger sa sortie standard vers l'entrée standard d'une autre.

Donc :
find . -exec echo {} ; | awk ' { print }'

Maintenant, note qu'il y a plus simple que « -exec echo {} ; », c'est
le « -print » :
find . -print | awk ' { print }'

Enfin, certaines versions de find ont un « -print » par défaut en
l'absence de toute autre commande, ce qui donne :
find . | awk ' { print }'

Quelle est la forme canonique pour parvenir au bon résultat
( en passant par l'option -exec et non pas par un pipe après le find ) ?


Rhâzut, je n'avais pas lu l'intérieur des parenthèses. Désolé. Alors tu
peux passer par un script externe qui contiendra le « | » ; je ne pense
pas qu'il existe une autre solution.

--
Olivier Miakinen


Avatar
Matthieu Moy
Olivier Miakinen <om+ writes:

Rhâzut, je n'avais pas lu l'intérieur des parenthèses. Désolé. Alors tu
peux passer par un script externe qui contiendra le « | » ; je ne pense
pas qu'il existe une autre solution.


Oui, ça a déjà été mentionné :

find . -exec sh -c "foo | bar" ;

--
Matthieu

Avatar
Paul Gaborit
À (at) Thu, 26 Oct 2006 09:46:55 +0200,
Matthieu Moy écrivait (wrote):
Olivier Miakinen <om+ writes:

Rhâzut, je n'avais pas lu l'intérieur des parenthèses. Désolé. Alors tu
peux passer par un script externe qui contiendra le « | » ; je ne pense
pas qu'il existe une autre solution.


Oui, ça a déjà été mentionné :

find . -exec sh -c "foo | bar" ;


Certes... mais comment insérer le nom du fichier courant dans la
commande sh ?

Évidemment, ceci *ne* *marche* *pas* (le {} n'est pas remplacé):

find . -exec sh -c "foo | bar {}" ;

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>


Avatar
Olivier Miakinen

Oui, ça a déjà été mentionné :

find . -exec sh -c "foo | bar" ;


Certes... mais comment insérer le nom du fichier courant dans la
commande sh ?

Évidemment, ceci *ne* *marche* *pas* (le {} n'est pas remplacé):

find . -exec sh -c "foo | bar {}" ;


$ cat foobar
foo | bar $1
$ find . -exec ./foobar {} ;


Avatar
Matthieu Moy
Paul Gaborit writes:

Certes... mais comment insérer le nom du fichier courant dans la
commande sh ?


Arf, c'est une FAQ, ça ;-)

Évidemment, ceci *ne* *marche* *pas* (le {} n'est pas remplacé):

find . -exec sh -c "foo | bar {}" ;


find . -exec sh -c 'echo "$0"' {} ;

De mémoire, il peut y avoir des problèmes de portabilités, certains sh
ne prennant pas $0 de la même façon. La solution portable a deux "{}"
après le bout de script, mais je préfère ne pas la citer de mémoire
pour éviter d'écrire une connerie ;-).

--
Matthieu

Avatar
JustMe
Matthieu Moy a écrit
Paul Gaborit writes:

Certes... mais comment insérer le nom du fichier courant dans la
commande sh ?


Arf, c'est une FAQ, ça ;-)

Évidemment, ceci *ne* *marche* *pas* (le {} n'est pas remplacé):

find . -exec sh -c "foo | bar {}" ;


find . -exec sh -c 'echo "$0"' {} ;

De mémoire, il peut y avoir des problèmes de portabilités, certains sh
ne prennant pas $0 de la même façon. La solution portable a deux "{}"
après le bout de script, mais je préfère ne pas la citer de mémoire
pour éviter d'écrire une connerie ;-).


C'est pas plutot "$@" ?


Avatar
Stan
"Olivier Miakinen" <om+ a écrit dans le message de news:
45406391$
Enfin, certaines versions de find ont un « -print » par défaut en
l'absence de toute autre commande, ce qui donne :
find . | awk ' { print }'

Quelle est la forme canonique pour parvenir au bon résultat
( en passant par l'option -exec et non pas par un pipe après le find ) ?


Rhâzut, je n'avais pas lu l'intérieur des parenthèses. Désolé. Alors tu
peux passer par un script externe qui contiendra le « | » ; je ne pense
pas qu'il existe une autre solution.



En fait, je pensais que l'utilisation du "-exec" du find
simplifierai peut être la lecture de mes scripts, mais
ce n'ai pas le cas ( comparé à un un pipe vers awk ).
Je pensais être passé à côté de qq chose, mais non ;-)

Merci pour vos remarques

--
-Stan


Avatar
Paul Gaborit
À (at) Thu, 26 Oct 2006 11:17:04 +0200,
Olivier Miakinen <om+ écrivait (wrote):

Oui, ça a déjà été mentionné :

find . -exec sh -c "foo | bar" ;


Certes... mais comment insérer le nom du fichier courant dans la
commande sh ?

Évidemment, ceci *ne* *marche* *pas* (le {} n'est pas remplacé):

find . -exec sh -c "foo | bar {}" ;


$ cat foobar
foo | bar $1
$ find . -exec ./foobar {} ;


C'est de la triche puisqu'il faut d'abord écrire un script.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>



1 2