Pages : 1
#1 Le 07/05/2016, à 21:03
- palima
Conserver les antislashs
Bonsoir,
J'ai récemment découvert la commande "gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=out.pdf fichier1.pdf fichier2.pdf ..." permettant d'alléger et de concaténer des pdf. Pour moi, c'est magique (si vous avez une explication, d'ailleurs, je suis preneur) et donc puisque je n'arriverai pas à la retenir, j'ai voulu sauvegarder la formule dans un script. Mais c'est surtout pour m'exercer à rédiger des scripts sheel en fait.
Enfin bref, voilà ce que j'ai fait :
Le premier argument est le nom du fichier de sortie. Tous les autres arguments sont les noms des fichiers à alléger et à concaténer entre eux.
#!/bin/bash
suite=""
for i in "$@"
do
suite=${suite}" "${i}
done
echo $suite
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=$1 $suite
J'ai une question et un problème :
- Y a -t-il plus efficace ? Peut-on reporter les noms des arguments sans créer une chaîne ?
- Si on appelle le script avec des noms de fichier avec des caractères qu'il faut échapper : ex
nom_du_script out.pdf fichier\ 1.pdf
, les antislashs d'échappement seront supprimés dans la chaîne "suite" pour ne laisser que les caractères qui avaient été échappés (ici l'espace entre "fichier" et "1.pdf") Le problème est lors de l'exécution de la commande principale, les antislashs ne seront pas remis :
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=bla.pdf fichier 1.pdf
Donc la commande va chercher le fichier "fichier" puis le fichier "1.pdf" plutôt que le fichier "fichier 1.pdf". Une solution ?
Merci de votre aide et bonne soirée,
Palima
Hors ligne
#2 Le 07/05/2016, à 21:19
- pingouinux
Re : Conserver les antislashs
Bonsoir,
Essaye en ne mettant que cette ligne dans ton script
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile="$@"
Hors ligne
#3 Le 07/05/2016, à 21:58
- palima
Re : Conserver les antislashs
Ah oui, tout simplement, je n'y avais pas pensé Puisque "-sOutputFile=" est à la fin, on n'a même pas besoin de casser la chaîne.
Et effectivement, ça marche.
Mais si la commande était quelque chose comme
gs -dBATCH -dNOPAUSE -q -sOutputFile=out.pdf -sDEVICE=pdfwrite fichier\ 1.pdf fichier\ 2.pdf
?
Hors ligne
#4 Le 07/05/2016, à 22:15
- MicP
Re : Conserver les antislashs
EDIT : Je ne peux pas barrer ce qui est dans le script, mais considérez que ce n'est pas bon et ne perdez pas de temps à le lire.
Je ne veux pas non plus cacher mon erreur : Si un modérateur ou un intervenant de ce fil me le demande, je supprimerai mes messages de ce fil.
contenu de nom_du_script
#!/bin/bash
fichSortie="${1}"
shift # Ça va faire en sorte que le deuxième paramètre deviendra le premier etc.
suite=""
for i in "$@"
do
suite="${suite} \"${i}\"" # Pour créer une liste des paramètres qui seront chacun encadré par des guillemets
done
echo "gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=\"${fichSortie}\"${suite}"
# Si la ligne affichée par ce script convient, il suffira de commenter (ou supprimer) celle qui est au dessus de ce commentaire
# et de dé-commenter la ligne de commandes suivante
# gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile="${fichSortie}"${suite}
michel@debg53sw:~/tstaeff$ ls -l
total 4
-rw-r--r-- 1 michel michel 0 mai 7 23:14 fichier1 avec espaces.pdf
-rw-r--r-- 1 michel michel 0 mai 7 23:14 fichier2 avec espaces.pdf
-rwxr--r-- 1 michel michel 466 mai 7 23:09 nom_du_script
michel@debg53sw:~/tstaeff$
michel@debg53sw:~/tstaeff$ ./nom_du_script "fichier De Sortie .pdf" *.pdf
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile="fichier De Sortie .pdf" "fichier1 avec espaces.pdf" "fichier2 avec espaces.pdf"
michel@debg53sw:~/tstaeff$
Dernière modification par MicP (Le 08/05/2016, à 12:25)
Hors ligne
#5 Le 07/05/2016, à 22:22
- palima
Re : Conserver les antislashs
Merci pour cette solution astucieuse.
Hors ligne
#6 Le 08/05/2016, à 04:53
- pingouinux
Re : Conserver les antislashs
Mais si la commande était quelque chose comme
gs -dBATCH -dNOPAUSE -q -sOutputFile=out.pdf -sDEVICE=pdfwrite fichier\ 1.pdf fichier\ 2.pdf
?
La commande en #2 devrait aussi marcher.
Hors ligne
#7 Le 08/05/2016, à 06:13
- MicP
Re : Conserver les antislashs
…La commande en #2 devrait aussi marcher.…
Effectivement, ça fonctionne.
Alors qu'en proposant ma solution, j'avais interprété sa demande, pensant qu'il allait utiliser en paramètres de son script des noms de fichiers comportant des espaces.
Je n'ai donc pas répondu à la demande.
Dernière modification par MicP (Le 08/05/2016, à 12:21)
Hors ligne
#8 Le 08/05/2016, à 08:41
- Compte anonymisé
Re : Conserver les antislashs
Pour moi, c'est magique (si vous avez une explication, d'ailleurs, je suis preneur)
la ligne de commande appelle ghostscript (gs) et lui donne quelques arguments.
Comprendre les arguments permet d'adapter la commande à son besoin. Les arguments possible sont généralement détaillés dans le manuel (commande : man gs).
-dBATCH mode "batch", pas documenté dans le manuel
-dNOPAUSE pas de pause après chaque page (pratique dans une ligne de commande)
-q mode silencieux (pas de message d'erreurs, pas indispensable)
-sOutputFile=out.pdf nom du fichier de sortie
-sDEVICE=pdfwrite lui dit d'imprimer dans un pdf
#9 Le 08/05/2016, à 10:52
- MicP
Re : Conserver les antislashs
http://www.ghostscript.com/doc/current/ … parameters
…
Interaction-related parameters
-dBATCH
Causes Ghostscript to exit after processing all files named on the command line, rather than going into an interactive loop reading PostScript commands.
Equivalent to putting -c quit at the end of the command line.
…
Mais je ne sais pas (je n'ai pas encore bien cherché) si cette option est vraiment prise en compte par gs sous linux
Dernière modification par MicP (Le 08/05/2016, à 10:54)
Hors ligne
#10 Le 08/05/2016, à 10:54
- Postmortem
Re : Conserver les antislashs
Édition par erreur
Dernière modification par Postmortem (Le 08/05/2016, à 12:01)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#11 Le 08/05/2016, à 11:06
- MicP
Re : Conserver les antislashs
Salut,
Ça fonctionne ça ??
Oui : Je n'ai fait qu'un copié/collé fidèle du retour des commandes avec les commandes et les prompts de départ et de retour de mes tests.
…Il devrait donc chercher des fichiers commençant par un guillemet et finissant par un guillemet.…
Non car l'interpréteur de commandes aura supprimé les guillemets pour transmettre le nom de fichier avec ses caractères espaces inclus sans les interpréter comme des caractères de séparation.
Par contre, ça ne fonctionnera pas avec ton script si tu utilise la liste avec la ligne de commande de gs car les caractères espaces trouvés dans les noms de fichiers seront interprétés par bash comme des caractères de séparation.
voir la variable du shell IFS
EDIT : Mais je n'avais pas pris le temps de tester la commande gs dé-commentée. Mea culpa.
Dernière modification par MicP (Le 08/05/2016, à 12:20)
Hors ligne
#12 Le 08/05/2016, à 11:47
- Postmortem
Re : Conserver les antislashs
Je maitiens que ça ne fonctionne pas !
Tu n'as fait qu'un echo. La commande que tu as commenté à la fin de ton script verra des guillemets qui n'ont pas de signification particulière.
Mon exemple le prouve.
Les guillemets ne sont interprétés par le shell que s'ils sont mis explicitements. Ils n'ont pas de signification particulière s'ils sont le résultat d'un développement de variable.
Édit:
Et justement,dans mon exemple, les guillemets sont retirés juste avant l'exécution, mais après qu'ils aient fait leur rôle de protection de l'espace !
Une variable n'est soumise au découpage avec les caractères de l'IFS que si cette variable n'est pas entre guillemets.
Ton $suite lui, est découpé ici :
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile="${fichSortie}"${suite}
Re édit :
J'ai modifié mon précédent post par erreur, il contenait ça :
$ cat test.sh
arg1=$1
shift
for i in "$@"
do
suite="$suite \"$i\""
done
ls -1 "$arg1"$suite
$ ls -1
entree 1.pdf
entree 2.pdf
entree 3.pdf
sortie.pdf
test.sh
$ ./test.sh sortie.pdf entree*
ls: "entree: No such file or directory
ls: 1.pdf": No such file or directory
ls: "entree: No such file or directory
ls: 2.pdf": No such file or directory
ls: "entree: No such file or directory
ls: 3.pdf": No such file or directory
sortie.pdf
$ cat test.sh
arg1=$1
shift
ls -1 "$arg1" "$@"
$ ./test.sh sortie.pdf entree*
entree 1.pdf
entree 2.pdf
entree 3.pdf
sortie.pdf
Dernière modification par Postmortem (Le 08/05/2016, à 12:00)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#13 Le 08/05/2016, à 12:01
- MicP
Re : Conserver les antislashs
Je maitiens que ça ne fonctionne pas !
Je confirme : tu as raison : ça ne fonctionne pas comme je l'espérais et les guillemets posent bien un problème.
=======
La solution que j'ai trouvé est donc beaucoup plus simple et c'est d'ailleurs pour ça que pingouinux ne disait rien : C'est la sienne en fait.
#!/bin/bash
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile="${@}"
=======
Je suis désolé et vous prie de m'excuser de vous avoir fait perdre votre temps,
et si vous le demandez, j'effacerai ces messages pour rendre ce fil plus lisible.
=======
Un grand MERCI sincère à Postmortem d'avoir pris le temps de me faire rendre compte de mon erreur.
Dernière modification par MicP (Le 08/05/2016, à 12:18)
Hors ligne
#14 Le 08/05/2016, à 12:53
- Postmortem
Re : Conserver les antislashs
La solution que j'ai trouvé est donc beaucoup plus simple et c'est d'ailleurs pour ça que pingouinux ne disait rien big_smile : C'est la sienne en fait.
pingouinux a toujours raison... Enfin très souvent en tous cas !
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#15 Le 08/05/2016, à 13:00
- MicP
Re : Conserver les antislashs
pingouinux a toujours raison...
Ouaih ! C'est ça !… Mais à un moment, y-en à marre quand même !
Va falloir trouver un moyen… En plus, je ne pense pas une seconde qu'on pourra l'avoir (surtout moi) sur ce terrain.
Ou alors, peut-être avec beaucoup de mauvaise foi, mais je ne suis pas assez entraîné dans ce domaine
Dernière modification par MicP (Le 08/05/2016, à 13:03)
Hors ligne
#16 Le 08/05/2016, à 17:42
- aduxas
Re : Conserver les antislashs
Ce qui est surprenant, c'est l'efficacité de cette concaténation. J'ai ici 27 fiches de paye avec une taille totale de 1.3 MB. Le fichier concaténé mesure 0.159 MB.
Hors ligne