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 :

Script scruter fichier supprimés dans un répertoire


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Script scruter fichier supprimés dans un répertoire
    Bonjour,
    Je cherche à écrire un script qui me permettrait de scruter en permanence un dossier qui contient plusieurs dizaines de milliers de fichiers. Dès qu'un fichier est supprimé (le fichier est supprimé par une application, pas directement par un utilisateur) il faudrait que son nom (au fichier) soit consigné dans un fichier log. Alors j'ai trouvé un bout de code qui permet de scruter un répertoire et qui liste tous les fichiers qui ont été rajoutés mais je n'arrive pas à lister tous les fichiers qui ont été enlevés.

    Voilà ce que j'ai trouvé:
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    #!/bin/sh
    # Script qui surveille les répertoires de façon infinie
    # Usage: prog rep1 [rep2 ...]
     
    # Ecriture de la fonction qui lance un traitement quelconque
    # Argument 1: Nom du fichier à traiter
    traitement()
    {
        (
            # Ici on programme le traitement (un simple "echo" pour l'exemple)
            echo $1
        )
    }
     
    # Ecriture de la fonction dont le but est de surveiller un répertoire
    # Argument 1: Nom du répertoire à surveiller
    # Argument 2: Nom du fichier qui sert à conserver les infos
    surveillance()
    {
        (
            # Balayage de chaque fichier du répertoire donné en argument 1
            ls -a $1 |while read file
            do
                # Si le fichier n'est pas présent dans les infos (donné en argument 2)
                grep "^$file$" $2 1>/dev/null; status=$?
                if test $status -ne 0
                then
                    # Le fichier est nouveau - Lancement du traitement
                    traitement $1/$file
                fi
     
                # On regénère les infos à partir du "ls"
                ls -a $1 >$2
            done
        )
    }
     
    # Ecriture du programme principal           
    # S'il n'y a pas d'argument, pas la peine de continuer
    test $# -eq 0 && exit 1
     
    # On diminue la priorité du script (après tout, il n'est pas vraiment primordial)
    nice -20
     
    # On récupère le nom du script (servira de base aux noms des fichiers de travail)
    script=`basename $0 .sh`
     
    # Boucle de surveillance infinie
    while true
    do
        # Traitement de chaque répertoire donné en argument
        for rep in $*
        do
           # Création du nom qui servira à stocker les infos du répertoire
           # On utilise le nom du répertoire en remplaçant "/" par ":"
           info=`echo "$rep" |sed -e "s/\//:/g"`
     
           # Surveillance du répertoire avec le fichier qui servira de mémoire
           surveillance "$rep" "/tmp/$script.$info.bdd"
        done
     
        # Petite tempo parce qu'on ne va pas surveiller à chaque nanoseconde
        sleep 1
    done

  2. #2
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    ça serait moins couteux en ressources que le processus qui supprime le fichier envoie un signal à ton serveur qu'il a supprimé un fichier en le désignant.
    Si tu persistes : inotifywait ou auditctl.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci pour le tuyau

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Bonjour,

    pourquoi les fonctions sont-elles exécutées dans un sous-shell ?
    ON N'UTILISE PAS ls DANS UN SCRIPT !!! et pourquoi -a ?
    si le code de retour d'une commande est utilisé immédiatement après, son enregistrement est inutile.
    pourquoi sh, et pas bash ? bash permettrait de se dispenser de basename et sed.

    test -ne, test -eq, c'est bien.

    à part ça, incron est fait pour ça.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    pourquoi les fonctions sont-elles exécutées dans un sous-shell ?
    ON N'UTILISE PAS ls DANS UN SCRIPT !!! et pourquoi -a ?
    si le code de retour d'une commande est utilisé immédiatement après, son enregistrement est inutile.
    pourquoi sh, et pas bash ? bash permettrait de se dispenser de basename et sed.

    test -ne, test -eq, c'est bien.

    à part ça, incron est fait pour ça.
    Tu devrais faire un article à ce propos et le linker à chaque fois, tu perdrais moins d'énergie en Allcaps.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    moi, je ferais un truc avec une boucle toute simple qui examine la liste des fichiers courants avec la dernière version:

    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
    20
    21
    #!/bin/bash
     
    DELAY=10
    OF=/tmp/lof-$$.txt
    NF=/tmp/lnf-$$.txt
    LOG=/tmp/log-$$.txt
     
    find . -type f | sort > "${OF}"
     
    while true; do
      sleep ${DELAY}
      /bin/rm -rf "${NF}" > /dev/null 2>&1
      find . -type f | sort > "${NF}"
      if cmp -s "${OF}" "${NF}" then continue; fi
      if test 0 -ne $(comm -23 "${OF}" "${NF}" | wc -l); then
        DATE=$(date)
        comm -23 "${OF}" "${NF}" | sed -e "s|^|On ${DATE} removed: |" >> "${LOG}"
      fi
      /bin/rm -rf "${OF}" > /dev/null 2>&1
      mv "${NF}" "${OF}"
    done

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    la syntaxe de test veut que la partie variable soit à gauche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test $(comm -23 "${OF}" "${NF}" | wc -l) -ne 0
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    Citation Envoyé par N_BaH Voir le message
    la syntaxe de test veut que la partie variable soit à gauche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test $(comm -23 "${OF}" "${NF}" | wc -l) -ne 0
    Et s'il n'y a pas de partie fixe ?

    Je ne comprends pas d'où vient l'exigence. Les deux syntaxes marchent.

    Nombreux sont les développeurs qui tapent 0==var, car var==0 pourrait devenir var=0 un jour où ils ne sont pas réveillés.
    "==" est le test et "=" l'affectation.
    0=var renvoie une erreur à l'inverse de var=0 qui laisse passer l'erreur.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    s'il n'y a pas de partie fixe, c'est test newest == oldest.
    autrement, c'est indifférent.

    "ça marche" n'est pas une justification suffisante. il y a plein de choses qui "marchent", mais qui ne sont pas correctes pour autant.
    "y en a qui le font" n'est pas une justification suffisante, non plus. il y a plein de choses qu'"y en a qui le font", mais qui ne sont pas correctes pour autant.


    par contre, je ne retrouve pas l'origine de cette convention.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. Réponses: 6
    Dernier message: 26/04/2017, 10h08
  2. Supprimer dans un répertoire les fichiers d'un type donné
    Par oodini dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 28/04/2010, 11h10
  3. Réponses: 6
    Dernier message: 14/06/2006, 16h55
  4. Réponses: 17
    Dernier message: 03/06/2006, 03h29
  5. [FPDF] créer un fichier PDF dans le répertoire courant
    Par patdez dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 09/10/2005, 15h37

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