2012-11-07 8 views

risposta

2

inotifywait è esattamente quello che stai cercando: http://linux.die.net/man/1/inotifywait

+0

Supponendo che "unix" significhi "Linux" qui. –

+0

Sì, ma non funziona con la condivisione di Windows CIFS montata su Linux. – Meloman

0

impostare un processo di cron che esegue uno script che prende l'attuale e lo confronta con un vecchio annuncio memorizzato in un file da qualche parte.

4
#! /usr/bin/env bash 

FILELIST=/tmp/filelist 
MONITOR_DIR=/home/usr/local 

[[ -f ${FILELIST} ]] || ls ${MONITOR_DIR} > ${FILELIST} 

while : ; do 
    cur_files=$(ls ${MONITOR_DIR}) 
    diff <(cat ${FILELIST}) <(echo $cur_files) || \ 
     { echo "Alert: ${MONITOR_DIR} changed" ; 
      # Overwrite file list with the new one. 
      echo $cur_files > ${FILELIST} ; 
     } 

    echo "Waiting for changes." 
    sleep $(expr 60 \* 2) 
done 

un modo rapido & sporco. :) Monitorerà la directory per le modifiche, non solo quando viene eseguito il dump di un nuovo file, ma anche se alcuni file sono mancanti/cancellati.

L'elenco dei file è memorizzato nella variabile $cur_files.

0

permette di dire la variabile si chiama $ listof

Creare uno script:

listOfFiles=`ls -t /home/user/local` 
for i in $listOfFiles 
do 
echo "$listOF" | grep $i 
if [[ "$?" -eq "0" ]] 
then 
listOF=$listOF" "$i 
fi 
done 

e mettere questo script nella crontab per cmd: crontab -e in formato:

1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59 * * * * <path to your script> 
+0

Penso che tu possa scrivere la voce 'crontab' in questo modo:' 0-59/2 * * * * ' – leafei

+0

Sì, puoi, ma a volte funziona, a volte no. :-) Dipende dalla distribuzione, dalla versione, ecc. –

0

Prima di tutto un grande grazie a Leafei, speravo fosse così facile. Tuttavia, per i miei dispositivi la scrittura di file temporanei per loops non era abbastanza portabile per il mio attuale project e avevo bisogno di eseguire azioni per varie cose che potevano accadere all'interno di una directory monitorata, quindi ecco lo script che ho scritto basandomi sulla risposta di leafei e testata localmente. formattazione Nota forse fuori sul primo post ...

#!/usr/bin/env bash 
Var_monitor_dir="${1?No directory passed}" 
Var_sleep_time="${2:-120}" 
Var_diff_opts="--suppress-common-lines" 
Func_parse_change(){ 
    _added_input="$(grep -E ">" <<<"${@}")" 
    _removed_input="$(grep -E "<" <<<"${@}")" 
    if [ "${#_added_input}" != "0" ]; then 
      mapfile -t _arr_added <<<"${_added_input}" 
      let _added_count=0 
      until [ "${#_arr_removed}" = "${_added_count}" ]; do 
       _current_path="${_arr_removed[${_added_count}]}" 
       if [ -f "${_current_path}" ]; then 
        echo "# ${0##*/} detected added file: ${_current_path}" 
       elif [ -d "${_current_path}" ]; then 
        echo "# ${0##*/} detected added directory ${_current_path}" 
       elif [ -p "${_current_path}" ]; then 
        echo "# ${0##*/} detected added named pipe ${_current_path}" 
       fi 
       ## Ignore other added input and add to index counter 
       let _added_count++ 
      done 
      unset _added_count 
    fi 
    if [ "${#_removed_input}" != "0" ]; then 
      mapfile -t _arr_removed <<<"${_added_input}" 
      let _removal_count=0 
      until [ "${#_arr_removed}" = "${_removal_count}" ]; do 
       echo "# Removal detected: ${_arr_removed[${_removal_count}]}" 
       let _removal_count++ 
      done 
    fi 
} 
Func_watch_dir(){ 
    _current_listing="" 
    while [ -d "${Var_monitor_dir}" ]; then 
     _new_listing="$(ls "${Var_monitor_dir}")" 
     _diff_listing="$(diff ${Var_diff_opts} <(echo "${_current_listing}") <(echo "${_new_listing}"))" 
     if [ "${#_diff_listing}}" != "0" ]; then 
      Func_parse_change "${_diff_listing}" 
     fi 
     _current_listing="${_new_listing}" 
     sleep ${Var_sleep_time} 
    done 
} 
if [ "${#@}" != "0" ]; then 
    Func_watch_dir 
    exit 0 
else 
    echo "${0##*/} needs a directory to monitor" 
    exit 1 
if 

Supponendo che quanto sopra viene salvato come monitor_directory.sh e la directory da monitorare è /tmp poi aprire un terminale e inserendo monitor_directory "/tmp" (o monitor_directory.sh "/tmp" "10" avere aggiornamenti più veloci tra i test) sarà avvia il ciclo che controlla le modifiche. Poi l'apertura di un secondo terminale provare inserendo il seguente e in attesa del primo terminale per aggiornare

mkdir -p /tmp/test_dir 
touch /tmp/test.file 

Dopo il tempo di attesa è il primo terminale dovrebbe riportare che è apparso un file e una directory, se si esegue il seguente e aspetta ancora che mostrerà anche le rimozioni.

rmdir /tmp/test_dir 
rm /tmp/test.file 

Spero che questo aiuti alcuni.

Problemi correlati