Forum Linux.débutant Script permettant d'effectuer un diff entre deux fichiers jour n et jour n-1

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
7
sept.
2022

Bonjour.

J'ai un problème avec un Script permettant d'effectuer un diff entre deux fichiers générés automatiquement par un système.
Le but étant d'automatiser le diff chaque jour entre le fichier du jour J et J-1.
Dans le nom du fichier la date y figure sous la forme yyyymmdd.

Voici le script.

#!/bin/sh
nomfic1=$(date --date '1 days ago' '+%Y%m%d')'Filter.txt'
echo "$nomfic1"
nomfic2=$(date --date '2 days ago' '+%Y%m%d')'Filter.txt'
echo "$nomfic2"
nomfic3=$(date --date '1 days ago' '+%Y%m%d')'DifFilter.txt'
echo "$nomfic3"
diff /home/$nomfic1 /home/$nomfic2 >> /home/$nomfic3

Les commandes echo sont présentes pour vérification des variables uniquement. Le problème étant sur le DIFF j'ai un retour du type :
: Aucun fichier ou dossier de ce type
: Aucun fichier ou dossier de ce type

Sachant que quand je suis dans mon shell: les commandes passées à la main fonctionnent.
J 'ai essayé plusieurs variante avec " avant et après le chemin du fichier: le résultat est le même.

Merci de votre aide.

  • # Il faut plus de détails

    Posté par  . Évalué à 1. Dernière modification le 07 septembre 2022 à 15:46.

    Bonjour

    Il faudrait nous dire ce que tu as tenté de faire pour que ton script puisse être automatiquement lancé tous les jours <=> quel est le programme qui lance le script et quelle est la directive exacte qui permet de déclencher l'exécution du script, et quel est le nom et le chemin absolu du script.

    (j'ai bien une petite idée de ce que tu aurais pu faire, mais j'ai besoin d'une confirmation détaillée de ce que tu as fait car tu pourrais avoir oublié de préciser quelques détails importants dans cette directive)


    … Le but étant d'automatiser le diff chaque jour entre le fichier du jour J et J-1. …

    Je suppose que le jour J est le jour précédant le jour où le script sera lancé.


    diff /home/$nomfic1 /home/$nomfic2 >> /home/$nomfic3

    Je suis très surpris que ces fichiers soient dans le répertoire /home/

    … je suis dans mon shell: les commandes passées à la main fonctionnent. … 
    

    … et que cette ligne de commande puisse fonctionner telle quelle en n'utilisant que les privilèges de ton compte utilisateur non privilégié.

    Tu as peut-être oublié de spécifier dans les noms de chemin de ces fichiers le nom du compte utilisateur :
    comme par exemple scriptnew qui serait utilisé pour nommer le sous-répertoire du répertoire /home/ qui servirait alors de répertoire personnel au compte utilisateur scriptnew

    ce qui donnerait : /home/scriptnew/

    • [^] # Re: Il faut plus de détails

      Posté par  . Évalué à 1.

      Bonjour
      Le chemin est bien /home/scriptnew
      La méthode envisagée pour le lancement automatique est une tâche crontab. Mais je n en suis pas encore là, le script ne fonctionnant pas en l exécutant.
      Merci.

      • [^] # Re: Il faut plus de détails

        Posté par  . Évalué à 1.

        si je comprend bien son commentaire il voulait pointer que :

        diff /home/$nomfic1 /home/$nomfic2 >> /home/$nomfic3

        c'est vachement différent de

        diff /home/scriptnew/$nomfic1 /home/scriptnew/$nomfic2 >> /home/scriptnew/$nomfic3

        toi tu travail direct dans /home, c'est peut être ton choix

  • # Bash ?

    Posté par  (Mastodon) . Évalué à 2. Dernière modification le 07 septembre 2022 à 16:07.

    Tu dis que ça passe à la main, mais sous quel shell es-tu à la main ?
    Au lieu de #!/bin/sh as-tu essayé avec #!/bin/bash ?

    En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

    • [^] # Re: Bash ?

      Posté par  . Évalué à 1. Dernière modification le 07 septembre 2022 à 17:19.

      … mais sous quel shell es-tu à la main …

      Non : ce n'est pas un problème de choix de shell utilisé

      Car les commandes utilisées dans ce script fonctionneraient tout aussi bien avec les deux shells (bash et sh) si la liste des chemins assignée à la variable PATH en permettait l'accès et si les privilèges du compte utilisateur qui avait lancé ce script lui permettait d'accéder en écriture dans le répertoire /home/

      Donc, ça dépend surtout de la méthode qui a été utilisée pour que ce script soit automatiquement lancé car cela permettra de savoir avec quels privilège ce script sera lancé et quelle sera la liste des chemins qui sera assignée à la variable PATH dans l'environnement d'exécution de ce script.

      (et si le premier caractère contenu dans ce script a été enlevé)

      • [^] # Re: Bash ?

        Posté par  (site web personnel, Mastodon) . Évalué à 2.

        Si, si… Si tu lances des commandes avec des bashismes, un interpréteur que POSIX peut se comporter différementsurr un certain nombre de détails. La première ligne, de shebang, indique l'interpréteur du script, et sauf s'il s'agit de lien, rien ne te dit que le shell n'est pas en cause (un echo $SHELL te dira celui que tu utilises intéractivement.)
        Les chemins sont un autre (second souci) et echo $PATH devrait t'indiquer les chemin recherchés. Les fichiers d'initialisation du shell intercatif en indique un certain nombre qui ne sont pas ceux, plus réduits, du cron (mais on peut paramétrer aussi cela au début du fichier de crontab)

        “It is seldom that liberty of any kind is lost all at once.” ― David Hume

  • # Si ton script est lancé par une tâche crontab

    Posté par  . Évalué à 1. Dernière modification le 07 septembre 2022 à 19:18.

    • Si tu as utilisé une tâche crontab créée depuis ton compte utilisateur pour lancer ce script
    • et si les 3 fichiers .txt utilisés dans ce script sont dans le répertoire personnel de ton compte utilisateur

    alors :

    • tu n'auras pas besoin de spécifier le répertoire dans lequel sont les fichiers .txt utilisés dans ce script car le répertoire courant par défaut utilisé lors de l'exécution de ce script sera le répertoire personnel de ton compte utilisateur
    • et tu n'auras pas à spécifier le chemin absolu des commandes utilisées dans ce script car le chemin /usr/bin est déjà dans la liste des chemins assignée à la variable PATH

    Voilà le contenu du script modifié (et sans le caractère S qui était juste avant le shebang)
    qui sera lancé par la tâche crontab :

    #!/bin/sh
    nomfic1=$(date --date '1 days ago' '+%Y%m%d')'Filter.txt'
    nomfic2=$(date --date '2 days ago' '+%Y%m%d')'Filter.txt'
    nomfic3=$(date --date '1 days ago' '+%Y%m%d')'DifFilter.txt'
    diff $nomfic1 $nomfic2 >> $nomfic3
    • Il faudra que ce script soit exécutable par ton compte utilisateur
    • et tu auras besoin de spécifier le chemin absolu de ce script (en utilisant, par exemple, la variable $HOME) dans la ligne de commande de la tâche crontab.

    À la suite de la commande dans la ligne crontab, tu pourrais ajouter une redirection de STDERR vers un fichier log, au cas où quelque chose ne se serait pas bien passé dans le script.


    Si tu as utilisé une autre méthode pour lancer ce script,
    il faudra le préciser, car autre contexte => autres contraintes.

    • [^] # Re: Si ton script est lancé par une tâche crontab

      Posté par  . Évalué à 1. Dernière modification le 07 septembre 2022 à 19:24.

      Correction :

      • et tu auras besoin de spécifier le chemin absolu de ce script …

      à remplacer par :

      • et si ce script est dans ton répertoire personnel, tu auras besoin de spécifier le chemin absolu de ce script …
      • [^] # Re: Si ton script est lancé par une tâche crontab

        Posté par  . Évalué à 1. Dernière modification le 07 septembre 2022 à 23:01.

        Bonjour,
        Merci pour ta réponse.
        Le script sera bien planifié chaque jour grâce à une tâche crontab.
        Mais je n en suis pas encore là. Le script ne fonctionnant pas en l executant depuis le prompt je ne suis pas passé à cron.
        Je vais essayé de suivre ta réponse.
        Merci.

        p.s. Le S devant le shebang est une faute de frappe à la recopie du script dans le forum.

        • [^] # Re: Si ton script est lancé par une tâche crontab

          Posté par  . Évalué à 1. Dernière modification le 08 septembre 2022 à 10:33.

          Bonjour

          Si le script /home/scriptnew/monscript.sh
          contient :

          #!/bin/sh
          nomfic1=$(date --date '1 days ago' '+%Y%m%d')'Filter.txt'
          nomfic2=$(date --date '2 days ago' '+%Y%m%d')'Filter.txt'
          nomfic3=$(date --date '1 days ago' '+%Y%m%d')'DifFilter.txt'
          diff $nomfic1 $nomfic2 > $nomfic3

          et si ce script est exécutable pour le compte utilisateur scriptnew

          scriptnew@machinedebian:~$ ls -l /home/scriptnnew/monscript.sh 
          -rwxr--r-- 1 scriptnnew scriptnnew 222  7 sept. 23:40 /home/scriptnnew/monscript.sh
          scriptnew@machinedebian:~$

          et si il existe les fichiers 20220906Filter.txt et 20220907Filter.txt dans le répertoire personnel du compte utilisateur scriptnew

          scriptnew@machinedebian:~$ ls -l /home/scriptnnew/2022090{7,8}Filter.txt
          -rw-r--r-- 1 scriptnew scriptnew 16  7 sept. 23:42 /home/scriptnew/20220907Filter.txt
          -rw-r--r-- 1 scriptnew scriptnew 24  4 sept. 23:43 /home/scriptnew/20220908Filter.txt
          scriptnew@machinedebian:~$```
          
          et si la ligne suivante a été ajoutée dans la table _crontab_ du compte utilisateur `scriptnew`
          
          ```text
          0 10 * * * $HOME/monscript.sh

          alors, si la session du compte utilisateur scriptnew est ouverte à ce moment là
          le 9 septembre à 10:00 le fichier /home/scriptnew/20220909DifFilter.txt sera créé

          et tous les jours à 10 heures si les fichiers dont le contenu à différencier existent
          alors un nouveau fichier /home/scriptnew/yyyymmddDifFilter.txt sera créé
          (bien sûr, avec yyyymmdd correspondant à la date du jour)

          • [^] # Re: Si ton script est lancé par une tâche crontab

            Posté par  (site web personnel, Mastodon) . Évalué à 2.

            et si il existe les fichiers 20220906Filter.txt et 20220907Filter.txt dans le répertoire personnel du compte utilisateur scriptnew

            versus

            nomfic1=$(date --date '1 days ago' '+%Y%m%d')'Filter.txt'

            Je verrais plutôt, avec dash,

            nomfic1="~scriptnew/$(date --date '1 days ago' '+%Y%m%d')Filter.txt"

            “It is seldom that liberty of any kind is lost all at once.” ― David Hume

            • [^] # Re: Si ton script est lancé par une tâche crontab

              Posté par  . Évalué à 1. Dernière modification le 09 septembre 2022 à 00:00.

              Ce n'est pas nécessaire de préciser le chemin du répertoire personnel du compte utilisateur
              puisque le chemin courant sera celui du répertoire personnel du compte utilisateur.

              Voici le retour de la commande env quand elle est lancée depuis le script qui est lui même lancé par la tâche crontab :

              HOME=/home/scriptnew
              LOGNAME=scriptnew
              PATH=/usr/bin:/bin
              LANG=fr_FR.UTF-8
              SHELL=/bin/sh
              PWD=/home/scriptnew
              

              Mais si tu veux utiliser le tilde pour indiquer le répertoire personnel du compte utilisateur, il faudra le faire suivre d'un caractère slash s'il doit être suivit d'autre chose

              ~/scriptnew
              
        • [^] # Re: Si ton script est lancé par une tâche crontab

          Posté par  (Mastodon) . Évalué à 3.

          p.s. Le S devant le shebang est une faute de frappe à la recopie du script dans le forum.

          J'ai corrigé

          En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

          • [^] # Re: Si ton script est lancé par une tâche crontab

            Posté par  . Évalué à 1.

            Arghh! : j'avais essayé d'adapter les copiés/collés,
            mais je vois que j'ai oublié de changer le nom du répertoire dans un des copiés/collés retournés dans mon dernier message.

            Mais je ne peux plus éditer mon dernier message
            dans lequel il faudrait changer :

            scriptnew@machinedebian:~$ ls -l /home/scriptnnew/2022090{7,8}Filter.txt
            -rw-r--r-- 1 scriptnew scriptnew 16  7 sept. 23:42 /home/michel/20220907Filter.txt
            -rw-r--r-- 1 scriptnew scriptnew 24  4 sept. 23:43 /home/michel/20220908Filter.txt
            scriptnew@machinedebian:~$

            par :

            scriptnew@machinedebian:~$ ls -l /home/scriptnnew/2022090{7,8}Filter.txt
            -rw-r--r-- 1 scriptnew scriptnew 16  7 sept. 23:42 /home/scriptnnew/20220907Filter.txt
            -rw-r--r-- 1 scriptnew scriptnew 24  4 sept. 23:43 /home/scriptnnew/20220908Filter.txt
            scriptnew@machinedebian:~$

            Merci.

  • # systemd

    Posté par  . Évalué à 0.

    En fonction de la distribution Linux que tu utilises
    il vaudrait peut-être mieux utiliser systemd pour ce genre de tâche journalière.

    Voir : archlinux -> systemd (Français)/Timers (Français)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.