web-dev-qa-db-fra.com

BASH Script Détection de modification des fichiers d'un répertoire

J'essaie de créer un script qui détecte si l'un des fichiers d'un répertoire a été modifié dans un intervalle de 2 secondes. Ce que j'ai jusqu'à présent est:

#!/bin/bash
for FILE in "${PWD}/*"
do
    SUM1="$(md5sum $FILE)"
    sleep 2
    SUM2="$(md5sum $FILE)"
    if [ "$SUM1" = "$SUM2" ];
    then
        echo "Identical"
    else
        echo "Different"
    fi
done

Ceci résulte une seule fois la valeur "identique", je souhaite que cela vérifie chaque fichier et sortie "identique" ou "différent" pour chaque fichier.

Modifier : Peut-on se faire sans installer le inotify-tools paquet?

10
dasj19

Vous pouvez utiliser inotify-outils définitivement à partir de la ligne de commande, par ex. comme ça :

inotifywait -r  -m /dir/to/monitor/

De - homme inotinywait

-m, --monitor

Au lieu de quitter après avoir reçu un seul événement, exécutez indéfiniment. Le comportement par défaut est de quitter après le premier événement.

Et voici un script qui surveille continuellement, copié du fichier homme de inotifywait:

#!/bin/sh
while inotifywait -e modify /var/log/messages; do
  if tail -n1 /var/log/messages | grep Apache; then
    kdialog --msgbox "Blah blah Apache"
  fi
done
9
Rahul

Vous pouvez utiliser le inotify-tools Paquet Pour surveiller toutes les modifications d'un dossier en temps réel. Par exemple, il contient l'outil inotifywait, que vous pourriez utiliser comme:

> inotifywait /tmp
Setting up watches.
Watches established.
/tmp/ MODIFY test

Vous pouvez utiliser des indicateurs pour filtrer certains événements uniquement ou certains fichiers. L'outil inotifywatch collecte les statistiques d'utilisation des systèmes de fichiers et les résultats de chaque événement inotify.

Vous pouvez trouver plus d'exemples ici par exemple.

Si vous souhaitez surveiller avec d'autres outils, vous pouvez utiliser find avec le -mmin Paramètre (minutes modifiées). Depuis 2 secondes, c'est comme 0,033 minutes, vous pouvez utiliser:

find . -type f -mmin 0.033
5
mazs

Si vous souhaitez surveiller un intervalle de deux secondes, vous pouvez entourer votre chèque avec:

while true
do
    <your steps>
    sleep 2
done

Bien que cela testera séquentiellement des fichiers et attendra 2 secondes pour chaque fichier trouvé, je suggère de transformer votre chèque dans une fonction:

function _check_file()
{
    SUM1=$(md5sum "$@")
    sleep 2
    SUM2=$(md5sum "$@")
    if [ "$SUM1" == "$SUM2" ];
    then
        echo "$@: Identical"
    else
        echo "$@: Different"
    fi
}

Qui peut être utilisé dans la boucle while:

while true
do
    for FILE in "${PWD}/"*
    do
        if [ -f "$FILE" ]
        then
            _check_file "$FILE" &
        fi
    done
    sleep 2
done

S'il vous plaît noter le & ampersand pour effectuer les chèques en arrière-plan pour effectuer les chèques de fichier en parallèle. Notez que cela peut avoir une incidence sur la performance en fonction du nombre de fichiers trouvés dans le répertoire.

Notez également que j'ai changé les lignes echo pour inclure le nom de fichier ("$@") Pour visualiser quel fichier est jugé identique/différent.

1
Lambert
#!/bin/bash
# pass one or more folders as arguments
while true; do
  for f in "$@"; do
    date
    echo "Checking $f and subfolders"
    find=$(find "$f" -type f)
    while read -r f2; do
      # strip non-alphanumeric from filename for a variable var name
      v=${f2//[^[:alpha:]]/}
      r=$(md5sum "$f2")
      if [ "$r" = "${!v}" ]; then
        echo "Identical $f2"
      else
        echo "Different $f2"
      fi
      eval "${v}=\$r"
    done <<< "$find"
  done
  sleep 2
done
0
dw1