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 02/12/2022, à 11:35

Fog1981

test sur le nom de fichier terminant par une chaine dans script

Bonjour ,

J'ai le script suivant qui identifie un fichier et qui l'envoi par mail dès sa creation dans un rep défini ce script fonctionne parfaitement
J'aimerai juste ajouté une condition qui vérifie que si le nom du fichier se termine par "-1.pdf"  (c'est a dire que si une copie est créer ) que ce fichier ne soit pas transmis par mail mais effacer car ce fichier a déja té transmis.

#!/bin/bash

# CONFIGURATION de la surveillance du dossier facture fournisseur
DIR="/home/fog/Google-Drive/Pro/Comptabilité/Factures/Facture-Fournisseur/
"
EVENT="create"
MAIL=exemple@ex.fr

#MAIN
inotifywait -m  -r --timefmt '%Y-%m-%d %H:%M:%S' -e $EVENT  --format '%T %w%f'  $DIR |
while read date time directoryfile 
do
    if [[ -d "$directoryfile" ]]
    then 
        echo "$date $time Dossier créé: $directoryfile/" 
    else
            echo  "$date $timeFichier créé: $directoryfile"
    # Envoie du fichier par mail
            echo "" | mail  -A "$directoryfile"  -s Justificatifs $MAIL 
            echo  "$date $time Fichier transmis: $directoryfile" 
      
    fi
done

Nous connaissons le nom du fichiers dans la variable $directoryfile
j'ai fais le tour avec grep , sed , find etc.. mais sans succès peut etre une erreur de syntaxe
Des idèes merci d'avance.

Hors ligne

#2 Le 02/12/2022, à 12:01

Tawal

Re : test sur le nom de fichier terminant par une chaine dans script

Hello,

Un test du genre :

[[ $directoryfile =~ -1.pdf$ ]] && echo "le fichier est une copie"

Edit:
Il manque pas un espace entre $time et Fichier ?

echo  "$date $timeFichier créé: $directoryfile"

devrait peut-être être :

echo  "$date $time Fichier créé: $directoryfile"

Dernière modification par Tawal (Le 02/12/2022, à 12:03)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#3 Le 02/12/2022, à 12:58

Fog1981

Re : test sur le nom de fichier terminant par une chaine dans script

Merci effectivement cela fonctionne mais pour etre franc cela m'a également permis de comprendre ou était mes erreurs , en fait je ne savais pas mais je faisait un if dans un if existant au lieu de elif.
Juste pour comprendre la sementique de la solution pouvez vous me décrire le role de =~ et du $ après -1.pdf merci
et oui il manquait un espace erreur lors de la copie
Merci encore  de votre aide

Dernière modification par Fog1981 (Le 02/12/2022, à 12:59)

Hors ligne

#4 Le 02/12/2022, à 21:42

Tawal

Re : test sur le nom de fichier terminant par une chaine dans script

man bash a écrit :

[[ expression ]]
              Renvoie un état de 0 ou 1 selon l'évaluation de la condition expression. Les conditions  sont  composées  de  primitives  décrites ci-dessous  dans  CONDITIONS.  Le découpage en mots et le développement des chemins ne sont pas effectués sur les mots entre [[ et ]] ; le développement des tildes, des paramètres, des variables, le développement arithmétique, la substitution de commande et  de processus, ainsi que la suppression des protections sont effectués. Les opérateurs conditionnels comme -f ne doivent pas être protégés afin d'être reconnus comme primitives.
              Lorsqu'ils sont utilisés avec [[, les opérateurs < et > ordonnent d'un point de vue lexicographique en  utilisant  les  paramètres linguistiques régionaux actuels.

       Consultez  la description de la commande interne test (consultez COMMANDES INTERNES DE L'INTERPRÉTEUR ci-dessous) pour la gestion des paramètres (c'est-à-dire des paramètres manquants).

       Quand les opérateurs == et != sont utilisés, la chaîne placée à droite de l'opérateur est considérée comme étant un motif dont la correspondance  est  recherchée  selon les règles décrites ci-dessous dans Motifs génériques, comme si l’option extglob de l’interpréteur était activée. L’opérateur = est équivalent à ==. Si l'option d'interpréteur nocasematch est activée, la mise en correspondance  est  effectuée sans tenir compte de la casse (différence majuscule/minuscule) des caractères alphabétiques. La valeur renvoyée est 0 si les chaînes correspondent (==) ou ne correspondent pas (!=), au motif et 1 sinon. Toute partie du motif peut être protégée pour forcer la partie  protégée à correspondre en tant que chaîne.

       Un opérateur binaire supplémentaire, =~, est disponible, avec la même priorité que == et !=. Lorsqu'il est utilisé, la chaîne à droite de l'opérateur est considérée comme une expression rationnelle étendue POSIX et est mise en correspondance en conséquence (en utilisant  habituellement les interfaces POSIX regcomp et regexec comme avec regex(3)). La valeur renvoyée est 0 si la chaîne correspond au motif et 1 si elle ne correspond pas. Si l'expression rationnelle n'est pas syntaxiquement correcte, la valeur renvoyée de  l'expression  conditionnelle  est  2. Si l'option d'interpréteur nocasematch est activée, la mise en correspondance est effectuée sans tenir compte de la casse.
       Toute partie du motif peut être protégée pour forcer la partie protégée à correspondre en tant que chaîne. Les expressions entre crochets des  expressions  rationnelles  doivent  être  traitées prudemment, car les caractères de protection habituels perdent leur signification entre crochets. Si le motif est stocké dans une variable de l’interpréteur, la protection de développement de variable force le motif entier à correspondre en tant que chaîne.

       Le  motif  correspondra  s'il correspond à n'importe quelle partie de la chaîne. Ancrer le motif avec les opérateurs d'expression rationnelle ^ et $ pour le forcer à correspondre à la totalité de la chaîne. La variable tableau BASH_REMATCH enregistre quelle  partie  de  la chaîne correspond au motif. L'élément de BASH_REMATCH d'indice 0 contient la partie de la chaîne correspondant à la totalité de l'expression rationnelle. Les sous-chaînes correspondant aux sous-expressions entre parenthèses dans l'expression rationnelle  sont  sauvegardées avec  les  indices  restants  de  BASH_REMATCH. L'élément de BASH_REMATCH d'indice n est la partie de la chaîne correspondant à la n-ième sous-expression entre parenthèses.


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#5 Le 03/12/2022, à 05:40

MicP

Re : test sur le nom de fichier terminant par une chaine dans script

Bonjour

Il faudrait éviter d'utiliser des noms de commandes
pour nommer des variables : date et time sont des noms de commandes

Hors ligne

#6 Le 03/12/2022, à 12:36

Watael

Re : test sur le nom de fichier terminant par une chaine dans script

pour des variables, ça va encore (le dollar les identifie), c'est pour les noms de fonctions que ça peut être problématique.

les noms de variables tout en majuscules sous réservés, par convention, aux variables d'environnement système.
un utilisateur peut panacher minuscules et majuscules pour améliorer la lisibilité : directoryFile, par exemple.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#7 Le 03/12/2022, à 13:19

MicP

Re : test sur le nom de fichier terminant par une chaine dans script

Les options d'une commande sous leur forme courte sont pratiques à utiliser dans la ligne de commande à entrer dans une fenêtre de terminal :

inotifywait  -m -r --timefmt '%Y-%m-%d %H:%M:%S' -e $EVENT --format '%T %w%f'  $DIR

… mais quand on relit plus tard le contenu d'un de ses script, on apprécie beaucoup d'y trouver les options des commandes utilisées sous leur forme longue,
ça permet de ne pas être obligé d'aller relire le manuel de chaque commande concernée :

inotifywait --monitor --recursive --timefmt '%Y-%m-%d %H:%M:%S' --event $EVENT --format '%T %w%f' $DIR

Dernière modification par MicP (Le 03/12/2022, à 13:20)

Hors ligne

#8 Le 03/12/2022, à 13:35

matrix-bx

Re : test sur le nom de fichier terminant par une chaine dans script

Fog1981 a écrit :

Juste pour comprendre la sementique de la solution pouvez vous me décrire le role de =~ et du $ après -1.pdf merci

Une réponse complète et exhaustive a été donnée.
En version plus courte et moins précise,
"=~" signifie "contient"
"$" désigne la fin de la ligne.
L'association des deux donne donc "se termine par la chaîne de caractère".

Bonne journée.


Utilisations des balises de mises en formes.

Hors ligne

#9 Le 08/12/2022, à 10:12

Fog1981

Re : test sur le nom de fichier terminant par une chaine dans script

Merci a tous pour les précisions de sementique concernant l'ecriture de script sh , et egalement pour l'explication longue et courte des condition d'un IF.
J'ai saisie mes erreurs et mon script fonctionne parfaitement. Merci encore pour vos aides respectives

Hors ligne

#10 Le 08/12/2022, à 14:34

Watael

Re : test sur le nom de fichier terminant par une chaine dans script

ça ne fait pas partie de la syntaxe de if, mais de celle de [[.
la structure de if, c'est :

if COMMANDES; then COMMANDES; [ elif COMMANDES; then COMMANDES; ]... [ else COMMANDES; ] fi

dans laquelle [[ remplace le premier COMMANDES.

ici, if évalue le retour de la commande [[, mais ça pourrait être n'importe quelle autre commande (hormis celles, bien sûr, dont le retour est toujours positif à moins d'une erreur de syntaxe "interne" (sed, find...)).


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne