Unix - pipes

Unix - pipes - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 16-03-2011 à 20:36:30    

Bonjour,
j'essaie d'appliquer ce que j'ai appris sur les pipes sur un cas concret qui me serait utile : j'ai de nombreux fichiers .eps dans un répertoire que j'aimerai convertir à la volée en .pdf grâce à epstopdf.
Voici la commande que j'ai tapée dans le shell :

Code :
  1. ls *.eps | epstopdf


ou encore

Code :
  1. ls | grep .eps | epstopdf


ce qui me donne

Citation :

!!! Error: Input filename missing


 
Quelqu'un pourrait me donner l'astuce pour que cela fonctionne ?
Merci d'avance  :hello:

Reply

Marsh Posté le 16-03-2011 à 20:36:30   

Reply

Marsh Posté le 16-03-2011 à 20:49:03    

find . -iname "*.eps" -exec epstopdf {} \;


 
trouver tous les fichiers .eps et les passer en argument à epstopdf
 
ce que tu fais toi c'est donner la liste des fichiers en entrée standard (stdin) à epstopdf, qui attend un nom de fichier en argument, pas sur stdin.


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 18-03-2011 à 11:21:52    

Oui mais cette solution n'utilise pas les pipes
D'autre part cette solution se limite à un certains nombre de fichiers.
 
Il vaut mieux utiliser xargs.

Reply

Marsh Posté le 18-03-2011 à 11:28:40    

Dans mon cas la commande donnée par black_lord a fonctionné, merci !
Je ne connaissais pas xargs, je vais regarde ça  :)  .


Message édité par Profil supprimé le 18-03-2011 à 11:29:09
Reply

Marsh Posté le 18-03-2011 à 20:03:05    

bichtoubard a écrit :

Oui mais cette solution n'utilise pas les pipes


C'est pas un mal  :o  
 

bichtoubard a écrit :

D'autre part cette solution se limite à un certains nombre de fichiers.


 :heink:  


---------------
[mon feed]
Reply

Marsh Posté le 18-03-2011 à 20:21:16    

bichtoubard a écrit :

Oui mais cette solution n'utilise pas les pipes
D'autre part cette solution se limite à un certains nombre de fichiers.
 
Il vaut mieux utiliser xargs.


 
ok lol. ne pas utiliser les pipes n'est pas un mal pour le coup, et non, c'est pas limité en arguments. Accessoirement xargs est considéré comme non sur....


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 23-03-2011 à 13:23:11    

Disons qu'il y a marqué pipe dans le titre.
 
Le fait de passer une commande bash sur un exec a un find se limite à un certains nombre de fichiers
 

Code :
  1. getconf ARG_MAX


 
http://www.gnu.org/software/coreut [...] t-too-long
 

Reply

Marsh Posté le 23-03-2011 à 14:44:53    

bichtoubard a écrit :

Disons qu'il y a marqué pipe dans le titre.
Le fait de passer une commande bash sur un exec a un find se limite à un certains nombre de fichiers


 
Non puisque find va appeler epstopdf sur chaque fichier.

Reply

Marsh Posté le 23-03-2011 à 18:00:46    

bichtoubard a écrit :

Disons qu'il y a marqué pipe dans le titre.


Intégriste va :o  
Le find de black_lord est beaucoup mieux et moins tordu que des pipes dans tous les sens. Et en plus c'est scriptable ainsi sans sushi :D


---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
Reply

Marsh Posté le 23-03-2011 à 20:08:12    

bichtoubard a écrit :

Disons qu'il y a marqué pipe dans le titre.
 
Le fait de passer une commande bash sur un exec a un find se limite à un certains nombre de fichiers
 

Code :
  1. getconf ARG_MAX


 
http://www.gnu.org/software/coreut [...] t-too-long
 


 
avant de jouer au malin relis bien ce qu'il y a d'écrit :o tu t'es planté :spamafote: là le exec n'a qu'un seul argument, pas tous les fichiers, c'est l'avantage de cette solution. Si tu veux t'en convaincre fait un -print.


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 23-03-2011 à 20:08:12   

Reply

Marsh Posté le 24-03-2011 à 15:57:09    

C'est vrai sur le coup je me suis planté, find va fonctionner (j'étais pourtant sûr d'avoir déjà rencontré un "too many arguments" sur un find :( )
 
Je me souvenais plus exactement pourquoi il fallait utiliser xargs plutôt que find -exec, j'ai cru que c'était pour cette raison, mais en fait non c'est pour des questions de perfs que xargs est meilleur (http://www.sunmanagers.org/pipermail/summaries/2005-March/006255.html)
 
Quand au fait que xargs soit considéré comme "non sûr" je voudrai bien avoir tes sources sur le sujet.
 
Au final l'OP nous dit qu'il veut appliquer ce qu'il a appris sur les pipes, et vous lui proposez une solution sans pipe. Je trouve ça pas adapté c'est tout :o
C'est pas de l'intégrisme, ou une manière de me la raconter, c'est juste essayer de faire une réponse adaptée au sujet...

Reply

Marsh Posté le 24-03-2011 à 18:43:16    

Tu me rappelles un collègue de boulot qui avait posté une question sur notre forum interne pour une commande (pv), quelqu'un lui a répondu "RTFM Google" avec un lien vers des exemples et une explication précise de la commande, et celui qui a répondu s'est fait rembarré pour le "RTFM Google"  [:xla]  
 
Après les pipes c'est beau, mais en pratique tu galères parfois :o Un exemple ? regardes sur commandlinefu il y a finalement assez peu de pipes.
 
Version plus hard et plus crade, toujours sans pipe :

Code :
  1. for file in `ls *.pdf`; do epstopdf $file; done


 
 [:tang]


---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
Reply

Marsh Posté le 24-03-2011 à 21:18:24    

Si j'avais su que ma question déclencherait ce débat  :D  
 

bardiel a écrit :

Code :
  1. for file in `ls *.pdf`; do epstopdf $file; done



Désolé mais cette commande me parle déjà plus  :p . Pourquoi tu la déconseilles ?

Reply

Marsh Posté le 24-03-2011 à 23:12:54    

bichtoubard a écrit :

C'est vrai sur le coup je me suis planté, find va fonctionner (j'étais pourtant sûr d'avoir déjà rencontré un "too many arguments" sur un find :( )
 
Je me souvenais plus exactement pourquoi il fallait utiliser xargs plutôt que find -exec, j'ai cru que c'était pour cette raison, mais en fait non c'est pour des questions de perfs que xargs est meilleur (http://www.sunmanagers.org/pipermail/summaries/2005-March/006255.html)
 
Quand au fait que xargs soit considéré comme "non sûr" je voudrai bien avoir tes sources sur le sujet.
 
Au final l'OP nous dit qu'il veut appliquer ce qu'il a appris sur les pipes, et vous lui proposez une solution sans pipe. Je trouve ça pas adapté c'est tout :o
C'est pas de l'intégrisme, ou une manière de me la raconter, c'est juste essayer de faire une réponse adaptée au sujet...


 
pour le non sûr : "RTFM", c'est dedans. et mieux que xargs y'a parallel (un xargs sous stéroides). cela dit, tu n'as toujours pas donné de solution avec xargs (j'attends de voir, vu qu'il y a un piège :D)
 
 
 
parce que ça utilise le globbing (extension du caractère *) et que donc c'est soumis au "too many arguments".


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 25-03-2011 à 13:23:50    

Pour la solution avec les pipes, je dirai basiquement

Code :
  1. find ./ -type f -name "*eps" | xargs epstopdf


 
Je viens d'aller voir sur commandlinefu, tous les exemples de find utilisent xargs et non exec, et les exemples avec exec se font basher dans les commentaires avec les performances médiocres de exec.
 
Ceci dit les dernières versions de find pallient apparemment au problème avec la syntaxe suivante

Code :
  1. find . -iname "*.eps" -exec epstopdf {} +


Je connaissais pas.. mais manque de portabilité surement.
 
Oh et puis quitte à faire l'intégriste, bardiel je te conseille d'utiliser $() au lieu des backquote parce que c'est mieux :o
 
Quand à la sécurité de xargs effectivement on trouve ca dans le man

Citation :

      It is not possible for xargs to be  used  securely,  since  there  will always  be a time gap between the production of the list of input files  and their use in the commands that xargs issues.  If other  users  have access  to  the  system, they can manipulate the filesystem during this     time window to force the action of the commands xargs runs to apply  to files  that  you didnât intend.  For a more detailed discussion of this and related problems, please refer to the  ââSecurity  Considerationsââ chapter in the findutils Texinfo documentation.  The -execdir option of find can often be used as a more secure alternative.


 
Ceci dit a man find on trouve aussi ceci

Citation :


  -exec command ;
              Execute  command; [...]   There are unavoidable security problems surrounding  use  of  the  -exec  option;  you should use the -execdir option instead.


 
Donc pour le coup si tu proposes pas de solution avec execdir ton argument est invalide :o

Message cité 1 fois
Message édité par bichtoubard le 25-03-2011 à 15:27:04
Reply

Marsh Posté le 25-03-2011 à 18:14:05    

bichtoubard a écrit :

Oh et puis quitte à faire l'intégriste, bardiel je te conseille d'utiliser $() au lieu des backquote parce que c'est mieux :o


Bonne idée tiens... mais flemme :o


---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
Reply

Marsh Posté le 29-03-2011 à 14:06:57    

bardiel a écrit :


Code :
  1. for file in `ls *.pdf`; do epstopdf $file; done



Et un "Useless Use Award", un !
http://partmaps.org/era/unix/award.html#ls
Sinon y'a ça (mais sans pipe) :

while read
do
    epstopdf "${REPLY}"
done < <(find -maxdepth 1 -type f -iname \*.eps)


---------------
La réponse est 42
Reply

Marsh Posté le 29-03-2011 à 18:10:09    

Hého, j'ai dis plus crade, j'ai pas dit meilleur :o (black_lord a indiqué le pourquoi :D ) et au moins c'est du one-line...


---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
Reply

Marsh Posté le 29-03-2011 à 19:17:55    

C'est pas le globbing que je conteste, c'est la poupée russe "`ls *.pdf`". Et d'ailleurs je conteste rien, je sodomise les pucerons en zone urbaine à l'occasion mais à peine...  :D


---------------
La réponse est 42
Reply

Marsh Posté le 29-03-2011 à 21:49:31    

Dans ce cas je vais reprendre ta signature :
 
La réponse est 42.
 
 
 
 
 [:tang]


---------------
Grippe ? Coronavirus ? Portez votre masque correctement ! :D
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed