#1 Le 12/08/2019, à 09:24
- AGPArchitecture
[RESOLU] Fonction pour script
Bonjour à tous,
J'essaye de me faire un fonction pour un script qui analyse le contenu d'un zip et qui doit me dire uniquement si il y a des fichiers avec des nombres entre parenthèses dans les fichiers contenu dans le zip et afficher tous les fichiers du zip le cas échéant.
J'ai donc fait :
FicherAvecParenthese ()
{
local fichiers
fichier=$(zip -sf "$1") # récupération des fichiers contenus dans le zip
# Analyse avec grep
if [ "$(grep -p "\(\d\)" "$pages" | wc -l)" -eq 0 ]; then
echo "$fichiers"
fi
return 0
}
Je rencontre pourtant les problèmes suivant:
La commande zip -sf "$1" affiche quand même les fichiers alors que je souhaiterais uniquement les envois dans la variables sans les afficher
L'analyse avec grep ne fonctionne pas.
Comment pourrais-je résoudre les problèmes?
Merci pour l'aide
Dernière modification par AGPArchitecture (Le 13/08/2019, à 17:59)
Hors ligne
#2 Le 12/08/2019, à 11:17
- kamaris
Re : [RESOLU] Fonction pour script
Je ne comprends pas pourquoi ta commande zip afficherait sa sortie en l'occurrence, mais il y a divers problèmes de nommage et de casse dans ton code : fichier -> fichiers, grep -p -> grep -P, pages -> ??
Il faut revoir le test sur grep aussi. Voici ce que je te propose :
FicherAvecParenthese ()
{
local fichiers
fichiers=$(zip -sf "$1") # récupération des fichiers contenus dans le zip
# Analyse avec grep
echo "$fichiers" | grep -qP "\(\d\)" && echo "$fichiers"
return 0
}
Hors ligne
#3 Le 12/08/2019, à 14:13
- Watael
Re : [RESOLU] Fonction pour script
la variable est-elle indispensable :
zip -sf "$fichierZip" | grep -P '\(\d\)'
la fonction est-elle elle-même indispensable ? le code est répété dans le script ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 12/08/2019, à 14:40
- kamaris
Re : [RESOLU] Fonction pour script
Oui, je me suis dit la même chose, cependant grep n'affichera que les lignes contenant "\(\d\)", pas l'entièreté de l'archive. Il est possible d'y parvenir en rajoutant des lignes de contexte avec l'option -C et un nombre suffisamment grand, mais c'est un peu hasardeux…
Hors ligne
#5 Le 12/08/2019, à 16:39
- Watael
Re : [RESOLU] Fonction pour script
analyse[r] le contenu d'un zip [...] et afficher tous les fichiers du zip [...].
ah! au temps pour moi. Je n'ai pas lu le « tous », et j'avais compris "afficher les fichiers qui correspondent au motif".
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 12/08/2019, à 19:34
- AGPArchitecture
Re : [RESOLU] Fonction pour script
bon je pense que vous avez besoins de quelque info complementaires
En fait réellement je souhaite une fonction qui va vérifier dans les archives zip et rar si le contenu de l'archive contient des noms de fichiers avec des parenthèses. De plus, certaines archives ont une extension rar alors qu'il s'agit d'un zip et inversement.
En fait après quelques test, il semblerait que l'expression régulière du grep est mauvaise.
comment puis-je dire à grep de vérifier si il a y des chiffre entre parenthèse ou entre crochet???
Et si vous avez un bon tuto pour les expression regulière avec grep je suis preneur car je galère vraiment avec ces dernières....
Dernière modification par AGPArchitecture (Le 12/08/2019, à 20:27)
Hors ligne
#7 Le 12/08/2019, à 20:25
- Watael
Re : [RESOLU] Fonction pour script
grep -q ne retourne rien, alors wc ne retournera rien non plus !
et il y a une coquille dans le premier if
et plutôt que plusieurs if, un seul case/esac
et grep motif "$nomdeFichier" va chercher motif dans les fichiers, et pas dans les noms des fichiers
...
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 12/08/2019, à 20:42
- AGPArchitecture
Re : [RESOLU] Fonction pour script
Merci watael,
mais nos messages ce sont croisé lorsque j'ai modifié le post et tu as répondu alors que je le modifiait.....:o
J'avais finalement trouvé le problème qui venait de ma condition.
Voici donc ma fonction complète :
CheckNumPageBefore ()
{
# local pages
# local type=$(EbookType "$1")
local fichiers; local typeebook
typeebook=$(EbookType "$1")
echo "$typeebook"
if [ "$typeebook" = 'cbz' ]; then
fichiers=$(zip -sf "$1") # récupération des fichiers contenus dans le zip
if [ "$(echo "$fichiers" | grep -l '(' | wc -c)" -ne 0 ]; then
echo "$fichiers"
return 1
fi
fi
if [ "$typeebook" = 'cbr' ]; then
fichiers=$(unrar l "$1")
if [ "$(echo "$fichiers" | grep -l '(' | wc -c)" -ne 0 ]; then
echo "$fichiers"
return 1
fi
fi
#echo "$fichiers" | grep -qP "\(\d\)" && echo "$fichiers"
return 0
}
Comment puis-je donc changer ma condition du grep? parce que là je commence un peu à patauger......
Dernière modification par AGPArchitecture (Le 12/08/2019, à 20:43)
Hors ligne
#9 Le 12/08/2019, à 20:55
- MicP
Re : [RESOLU] Fonction pour script
Bonjour
…avec des nombres entre parenthèses …
Je comprends : avec un nombre (d'un ou plusieurs chiffres) situés entre des parenthèses
alors, la regex PERL serait :
"\(\d+\)"
ce qui matcherait pour, par exemple :
nom de fichier (1).txt
nom de fichier (42) bla bla.txt
nomdefichier(421).txt
=====
…Des noms de fichiers avec des parenthèses…
Je comprends : avec des parenthèses
alors, la regex PERL serait :
"\(|\)"
ce qui matcherait pour, par exemple :
nom de) fichier.txt
nom(de)fichier).txt
no(m de fichier.txt
=======
#!/bin/bash
case $(EbookType "$1") in
'cbz') fichiers=$(zip -sf "$1");;
'cbr') fichiers=$(unrar l "$1");;
*) echo "Erreur : Le fichier '$1' n'est ni un '.zip' ni un '.rar'"
exit 1;;
esac
if ! $(grep -qP "\(\d+\)" <<< "$fichiers"); then
echo "$fichiers"
fi
Dernière modification par MicP (Le 12/08/2019, à 21:41)
Hors ligne
#10 Le 12/08/2019, à 22:20
- kamaris
Re : [RESOLU] Fonction pour script
@MicP : y'a pas un problème à la fin ? Pourquoi mettre une substitution de commande ? Et pourquoi un test négatif ? Pourquoi pas tout simplement
grep -qP "\(\d+\)" <<< "$fichiers" && echo "$fichiers"
comment puis-je dire à grep de vérifier si il a y des chiffre entre parenthèse ou entre crochet???
Et si vous avez un bon tuto pour les expression regulière avec grep je suis preneur car je galère vraiment avec ces dernières....
Pour les expressions régulières, tu as wikipédia qui fait déjà un bon résumé : https://fr.wikipedia.org/wiki/Expressio … li%C3%A8re
Si tu veux matcher des chiffres entre parenthèses ou entre crochets, il faut que tu mettes à la fin
grep -qP "\(\d+\)|\[\d+\]" <<< "$fichiers" && echo "$fichiers"
Dernière modification par kamaris (Le 12/08/2019, à 22:21)
Hors ligne
#11 Le 12/08/2019, à 22:38
- MicP
Re : [RESOLU] Fonction pour script
Avec ça :
grep -qP "\(\d+\)|\[\d+\]" <<< "$fichiers" && echo "$fichiers"
si un des noms de fichiers contenus dans la variable fichiers "matche" avec le motif recherché (un nombre entre parenthèses ou crochets)
alors le contenu complet de la variable fichiers sera affiché.
…mais :
…qui doit me dire uniquement si il y a des fichiers avec des nombres entre parenthèses dans les fichiers contenu dans le zip
et afficher tous les fichiers du zip le cas échéant.…
Donc, "afficher…le cas échéant…" <=> afficher la liste contenue dans la variable fichiers seulement s'il n'y a aucun nom de fichier qui contienne un nombre entre parenthèse.
=======
Mais bon, suivant ce que AGPArchitecture voulait dire (et que j'ai peut-être mal compris )
il lui suffira d'enlever une négation (<=> le point d'exclamation qui suit le if)
ou bien de remplacer un && par un ||
grep -qP "\(\d+\)|\[\d+\]" <<< "$fichiers" || echo "$fichiers"
Hors ligne
#12 Le 12/08/2019, à 22:46
- melixgaro
Re : [RESOLU] Fonction pour script
Salut
le cas échéant \lə kɑ e.ʃe.ɑ̃\ ou \lə kɑ.z‿e.ʃe.ɑ̃\
Si l’occasion arrive ; si l’occasion s’en présente ; s’il y a lieu.
Je m’y attends, et je me borne à prévenir les individus quelconques, se disant magistrats, qui, en robe noire ou en robe rouge, brasseront la chose, que, le cas échéant, la condamnation à un maximum quelconque bel et bien prononcée, rien n’égalera mon dédain pour le jugement, si ce n’est mon mépris pour les juges. — (Victor Hugo, Napoléon le Petit, Livre deuxième, Le Gouvernement))
Nous donnons donc un coup d'œil à nos armes à feu et nous assurons qu'elles sont chargées et en état de servir le cas échéant. — (Frédéric Weisgerber, Trois mois de campagne au Maroc : étude géographique de la région parcourue, Paris : Ernest Leroux, 1904, p. 45)
Il est possible d’inclure dans un projet de loi de ratification des dispositions modifiant, le cas échéant pour corriger des erreurs, ou complétant celles introduites par l’ordonnance à ratifier. — (Secrétariat général du gouvernement et Conseil d’État, Guide de légistique, 3e version, La Documentation française, 2017, ISBN 978-2-11-145578-8 → lire en ligne)
Linux depuis ~2007. Xubuntu seulement.
Hors ligne
#13 Le 12/08/2019, à 23:52
- MicP
Re : [RESOLU] Fonction pour script
@melixgaro
Oui, effectivement, l'expression "le cas échéant" avait été (comme c'est souvent le cas) mal employée
Bien employée, l'expression "le cas échéant" veux dire : "si cela se produit" ou "si cela est nécessaire" ou "au cas où cela arrive"
et pas "dans le cas contraire" :
Dans le script contenu dans le premier message
il fallait que le retour du comptage (par wc -l) des fichiers trouvés par grep
soit égal à 0 pour que l'affichage de la liste soit fait.
Hors ligne
#14 Le 13/08/2019, à 00:05
- melixgaro
Re : [RESOLU] Fonction pour script
Ben, moi, j'ai compris bêtement (càd sans chercher à deviner si l'emploi était correct ou pas) et donc qu'AGPArchitecture voulait afficher le contenu dans l'archive lorsqu'il y a des () ou []. Mais à la relecture, tu as raison, ça semble en contradiction avec le script posté en 1.
N'ayant pas eu le temps de répondre dans la journée, j'ai vu que vous aviez déjà la situation bien en main et n'ai pas posté de propositions de solution. J'espère que tu n'as pas mal pris le fait que je poste la signification de l'expression (c'était autant pour moi que pour les autres lecteur⋅rices puisque mon cerveau a tendance à interpréter le « cas échOUant » au lieu de « cas échéant », et donc à l'interpréter totalement à l'envers ).
Dernière modification par melixgaro (Le 13/08/2019, à 10:00)
Linux depuis ~2007. Xubuntu seulement.
Hors ligne
#15 Le 13/08/2019, à 01:52
- MicP
Re : [RESOLU] Fonction pour script
Oh que non, je ne l'ai pas du tout mal pris,
d'autant que je n'avais jamais très bien compris cette expression,
et de fait, je l'avais encore mal interprétée.
Ton message permet de lever le doute sur le sens de cette expression.
Merci
Hors ligne
#16 Le 13/08/2019, à 07:51
- AGPArchitecture
Re : [RESOLU] Fonction pour script
Ola, On va se calmer
Il s'agit d'une erreur de ma part. Le cas échéant est bien utilisé dans mon message par contre il y a effectivement une erreur dans la condition...
En effet, j'ai essayé plusieurs choses avant de poster pour voir ce qui pouvait bien poser problème le code a donc changer de multiple fois; il en a découlé que la ligne suivant :
[ "$(grep -p "\(\d\)" "$pages" | wc -l)" -eq 0 ]
aurait du devenir
[ "$(grep -p "\(\d\)" "$pages" | wc -l)" -ne 0 ]
Je ressayerai chez moi ce soir avec les différentes solutions (je n'ai pas accès aux archives au bureau) et reviendrai vers vous si il y a encore un problème.
En tout cas merci pour l'aide ca me permet de comprend bash un peu plus de jour en jour ce qui n'est pas un mince affaire pour un petit amateur;
Hors ligne
#17 Le 13/08/2019, à 17:59
- AGPArchitecture
Re : [RESOLU] Fonction pour script
je suis parvenu a faire ce que je veux avec cette fonction :
CheckNumPageBefore ()
{
case $(EbookType "$1") in
'cbz') fichiers=$(zip -sf "$1");;
'cbr') fichiers=$(unrar l "$1");;
*) echo "Erreur : Le fichier '$1' n'est ni un '.zip' ni un '.rar'"
return 1;;
esac
if $(grep -qP "\(\d+\)|\[\d+\]" <<< "$fichiers"); then
echo "$fichiers"
return 0
fi
return 2
merci à tous
Hors ligne