IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Détection remplacement fichier


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2012
    Messages : 43
    Par défaut Détection remplacement fichier
    Bonjour à tous,

    Alors voilà, je dispose d'un serveur unix sur lequel j'ai un dossier nommé "fic". Dans ce dossier, j'ai un fichier nommé "test.csv".

    Après quelques recherches infructueuses, je me permet de poster ma question ici.

    J'aurais aimé avoir un script shell (si possible en korn shell) qui me permet de détecter le remplacement de ce fichier pour pouvoir exécuter différentes instructions à chaque modification de celui-ci.

    J'espère que cela est possible.
    Merci.

  2. #2
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Par défaut
    Salut,

    Regarde Incron ça devrait correspondre à ce que tu veux.

    Lien ici et .
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par lllhuhdklll Voir le message
    Bonjour à tous,

    Alors voilà, je dispose d'un serveur unix sur lequel j'ai un dossier nommé "fic". Dans ce dossier, j'ai un fichier nommé "test.csv".

    Après quelques recherches infructueuses, je me permet de poster ma question ici.

    J'aurais aimé avoir un script shell (si possible en korn shell) qui me permet de détecter le remplacement de ce fichier pour pouvoir exécuter différentes instructions à chaque modification de celui-ci.

    J'espère que cela est possible.
    Merci.
    Voici une possibilité qui marche pour un remplacement du fichier.
    Elle ne marche pas pour un 'touch' du fichier, ni pour une édition avec un éditeur intelligent qui appende sans changer le inode, ni (à vérifier) pour une modification du genre 'echo coucou >> fic'.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/ksh
    file=$1
    typeset -i file_inode old_file_inode=$(stat -c '%i' "${file}")
     
    while true ; do
        file_inode=$(stat -c '%i' "${file}")
        if [[ ${file_inode} -ne ${old_file_inode} ]] ; then
            old_file_inode=${file_inode}
            print "file ${file} changed at $(date)"
        fi
        sleep 1
    done
    si le 'stat' ne marche pas, on peut utiliser 'ls -i $file' (sauf que N_BaH va pas être d'accord (car on n'utilise pas 'ls' dans un script!)).

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2012
    Messages : 43
    Par défaut
    Citation Envoyé par Winnt Voir le message
    Regarde Incron ça devrait correspondre à ce que tu veux.
    Malheureusement, je crois que je n'ai pas les droits pour l'installation sur les serveurs.

    Citation Envoyé par jack-ft Voir le message
    Voici une possibilité qui marche pour un remplacement du fichier.

    Si le 'stat' ne marche pas, on peut utiliser 'ls -i $file' (sauf que N_BaH va pas être d'accord (car on n'utilise pas 'ls' dans un script!)).
    Effectivement, stat ne fonctionne pas.

    Voici le script tel que je l'ai modifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/ksh //J'ai changé le chemin sinon ça ne fonctionnais pas
    file=$1
    typeset -i file_inode old_file_inode=$(ls -i -c '%i' "${file}")
     
    while true ; do
        file_inode=$(ls -i -c '%i' "${file}")
        if [[ ${file_inode} -ne ${old_file_inode} ]] ; then
            old_file_inode=${file_inode}
            print "file ${file} changed at $(date)"
        fi
        sleep 1
    done
    A l'affichage, j'ai par exemple :
    test.ksh[3]: .:^J 1643064 fichier1.csv^J 1643059 fichier2.csv: syntax error

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    L'horodatage d'un fichier se manipule facilement. Si on veut savoir si un fichier a vraiment changé, le mieux est d'en calculer la checksum (md5sum) et de la comparer aux anciennes versions du fichier. C'est la technique utilisée par rsync pour trouver les morceaux de fichiers qui ont été modifiés.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par lllhuhdklll Voir le message
    A l'affichage, j'ai par exemple :
    test.ksh[3]: .:^J 1643064 fichier1.csv^J 1643059 fichier2.csv: syntax error
    Ah oui, mais là non!

    Est-ce que par hasard tu as lancé le script sur plusieurs fichiers?
    Genre mon_script.ksh fic*.csv ?

    Je n'ai pas écrit le script complet (faut bien que tu bosses un peu!), notamment la gestion d'erreur:
    le script que j'ai fourni est censé prendre un seul fichier en argument...
    Si tu veux en vérifier plusieurs, faut faire autrement...

    De plus, je ne connais pas cette syntaxe ls -i -c '%i' <file>.
    En revanche, je connais ls -i <file>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/usr/bin/ksh //J'ai changé le chemin sinon ça ne fonctionnais pas
    file=$1
    if [[ ! -f "${file}" ]] ; then
      print "pas bon fichier: ${file}"
      exit 1
    fi
     
    typeset -i file_inode old_file_inode=$(ls -i "${file}")
    old_file_inode=${old_file_inode%% *} # pour garder ce qui est avant la première espace
     
    while true ; do
        file_inode=$(ls -i "${file}")
        file_inode=${file_inode%% *}
        if [[ ${file_inode} -ne ${old_file_inode} ]] ; then
            old_file_inode=${file_inode}
            print "file ${file} changed at $(date)"
        fi
        sleep 1
    done

  7. #7
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Par défaut
    Salut,

    Si jamais les inotify-tools sont installés ceci peut t'aider.
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Si le but est de surveiller le contenu, l'accès ou l'horodatage d'un fichier, un ls ne suffira pas. Le mieux est d'utiliser le sous-système du noyau inotify, comme suggéré plus haut.

    Certaines distros fournissent des API vers ce sous-système comme inotifywait. Voici un exemple d'une simple commande qui va journaliser tous les changements de contenu ou d'horodatage d'un fichier /tmp/test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inotifywait -m -e modify -e attrib -o change_log --timefmt '%Y-%m-%d %H:%M:%S' --format '%T' /tmp/test

  9. #9
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Par défaut
    @ripat Rhooo le vil copiteur
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2012
    Messages : 43
    Par défaut
    Bon, inotify-tools n'est pas installé. Va falloir que j'essaye d'avoir les droits pour l'installer.

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Citation Envoyé par Winnt Voir le message
    @ripat Rhooo le vil copiteur
    Ta suggestion d'utiliser inotify était la piste la plus efficace car prise au noyau. J'ai juste un peu développé.

    inotify existe dans certains noyaux unix. Mais sans les API de inotify-tools il faudra faire du C et compiler.

    Sans inotify, reste md5sum pour vérifier si un contenu a changé. Mais on se trouve dans le user space et plus dans le kernel space. Plus lourd.

  12. #12
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Par défaut
    Salut,

    Citation Envoyé par lllhuhdklll
    Bon, inotify-tools n'est pas installé. Va falloir que j'essaye d'avoir les droits pour l'installer.
    Si ton admin accepte fait lui installer incron il reprend les possibilité des inotify-tools avec une crontab en fait.
    A titre perso je l'utilise pour la génération de clef md5 et c'est super pratique. Car tu peux surveiller aussi bien un répertoire ou un fichier et agir en conséquence.

    Citation Envoyé par ripat
    Ta suggestion d'utiliser inotify était la piste la plus efficace car prise au noyau. J'ai juste un peu développé.
    Merci
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

Discussions similaires

  1. Remplacer fichier déjà présent
    Par mattwarend dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/10/2008, 10h21
  2. Détection format fichier
    Par YvesCa dans le forum C++
    Réponses: 17
    Dernier message: 04/12/2007, 13h35
  3. Forcer remplacement fichier texte
    Par krugarka dans le forum LabVIEW
    Réponses: 2
    Dernier message: 03/10/2007, 14h02
  4. [JMF] Remplacer fichier audio par un micro
    Par Tostaki dans le forum Multimédia
    Réponses: 1
    Dernier message: 24/03/2006, 20h23
  5. remplacer fichier DBF
    Par jeff06_2 dans le forum Bases de données
    Réponses: 3
    Dernier message: 14/01/2005, 09h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo