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

AGPArchitecture a écrit :

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

Dans son message #1, AGPArchitecture a écrit :

…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

=====

Dans son message #6, AGPArchitecture a écrit :

…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"
AGPArchitecture a écrit :

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 :

Dans son message #1, AGPArchitecture a écrit :

…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 smile )
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

cas échéant

wiki a écrit :

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)

wink


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 big_smile). wink

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 smile

Hors ligne

#16 Le 13/08/2019, à 07:51

AGPArchitecture

Re : [RESOLU] Fonction pour script

Ola, On va se calmer lol big_smile

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