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