Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1556 connectés 

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Unix - pipes

n°1270398
Profil sup​primé
Posté le 16-03-2011 à 20:36:30  answer
 

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:

mood
Publicité
Posté le 16-03-2011 à 20:36:30  profilanswer
 

n°1270400
black_lord
Modérateur
Truth speaks from peacefulness
Posté le 16-03-2011 à 20:49:03  profilanswer
 

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
n°1270589
bichtoubar​d
Posté le 18-03-2011 à 11:21:52  profilanswer
 

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.

n°1270590
Profil sup​primé
Posté le 18-03-2011 à 11:28:40  answer
 

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
n°1270646
fighting_f​alcon
Posté le 18-03-2011 à 20:03:05  profilanswer
 

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]
n°1270647
black_lord
Modérateur
Truth speaks from peacefulness
Posté le 18-03-2011 à 20:21:16  profilanswer
 

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
n°1271248
bichtoubar​d
Posté le 23-03-2011 à 13:23:11  profilanswer
 

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
 

n°1271251
mr simon
Posté le 23-03-2011 à 14:44:53  profilanswer
 

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.

n°1271304
bardiel
Debian powa !
Posté le 23-03-2011 à 18:00:46  profilanswer
 

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
n°1271321
black_lord
Modérateur
Truth speaks from peacefulness
Posté le 23-03-2011 à 20:08:12  profilanswer
 

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
mood
Publicité
Posté le 23-03-2011 à 20:08:12  profilanswer
 

n°1271397
bichtoubar​d
Posté le 24-03-2011 à 15:57:09  profilanswer
 

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...

n°1271413
bardiel
Debian powa !
Posté le 24-03-2011 à 18:43:16  profilanswer
 

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
n°1271426
Profil sup​primé
Posté le 24-03-2011 à 21:18:24  answer
 

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 ?

n°1271439
black_lord
Modérateur
Truth speaks from peacefulness
Posté le 24-03-2011 à 23:12:54  profilanswer
 

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
n°1271521
bichtoubar​d
Posté le 25-03-2011 à 13:23:50  profilanswer
 

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
n°1271572
bardiel
Debian powa !
Posté le 25-03-2011 à 18:14:05  profilanswer
 

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
n°1271959
twocats
Posté le 29-03-2011 à 14:06:57  profilanswer
 

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
n°1272010
bardiel
Debian powa !
Posté le 29-03-2011 à 18:10:09  profilanswer
 

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
n°1272019
twocats
Posté le 29-03-2011 à 19:17:55  profilanswer
 

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
n°1272040
bardiel
Debian powa !
Posté le 29-03-2011 à 21:49:31  profilanswer
 

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


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

Aller à :
Ajouter une réponse
 

Sujets relatifs
script unix ajoutant la date à chaque nouvelle ligneCommande Unix pour travailler avec des fichiers incrémentés
Transfert de données Unix<>Linux Ubuntu[UNIX] lister les répertoires?
Unix et netbackupLenteur en Emission réseau sur Unix
Script Unix (sh) - Créer un fichier .log - Récupérer message d'erreurImprimante virtuelle CUPS pour envoi de FAX via Frebox pour Unix-likes
utiliser ma clé pageant sur unix [résolu]Unix/Linux - Par ou commencer ?
Plus de sujets relatifs à : Unix - pipes


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR