Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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é tongue 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

palima #3 a écrit :

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 big_smile : 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

MicP a écrit :

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

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

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