Ho una directory denominata /home/user/local
. Ogni due minuti circa, un nuovo file viene scaricato in questa directory. Devo controllare questa directory ogni 2 minuti per vedere se un nuovo file/file è atterrato lì. E se ci sono nuovi file, ho bisogno di metterne una lista in una variabile da usare in seguito. Come faccio questo script di shell?Come trovare se ci sono nuovi file in una directory ogni 2 minuti nello script di shell?
risposta
inotifywait
è esattamente quello che stai cercando: http://linux.die.net/man/1/inotifywait
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.
#! /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
.
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>
Penso che tu possa scrivere la voce 'crontab' in questo modo:' 0-59/2 * * * *
Sì, puoi, ma a volte funziona, a volte no. :-) Dipende dalla distribuzione, dalla versione, ecc. –
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.
- 1. Operazione temporanea in una directory temporanea nello script di shell
- 2. Tempo di incremento (minuti e secondi) nello script bash/shell
- 3. Run script di shell per ogni file nella directory
- 4. Elaborazione o threading parallelo nello script Shell
- 5. Come ottenere l'estensione di un file nello script di shell
- 6. Che cosa $? $ 0 $ 1 $ 2 significa nello script di shell?
- 7. se istruzione per controllare $ HOSTNAME nello script di shell
- 8. script di shell per mostrare la frequenza di ogni parola in un file e in una directory
- 9. carica nuovi file nella directory
- 10. Cosa succede se ci sono troppi file in una singola directory in Linux?
- 11. Rinominare i file in una directory UNIX - scripting della shell
- 12. Una riga if/else condition nello script di shell linux
- 13. Script shell: come eliminare tutti i file in una directory tranne quelli elencati in un file?
- 14. Controllare l'output di un comando nello script di shell
- 15. Quanti file di intestazione ci sono nello standard C++?
- 16. Modifica per utente root nello script di shell
- 17. esportazione non funziona nello script shell
- 18. Conteggiare file e directory utilizzando lo script di shell
- 19. Script shell Linux per ogni file in una directory Prendi il nome file ed esegui un programma
- 20. Script di shell per verificare se esiste una directory e se non crearla?
- 21. script di shell aggiungi suffisso ogni riga
- 22. argomento di passaggio che contiene spazio nello script di shell
- 23. Come trovare il file/pochi minuti fa
- 24. allarme Scheduling ogni 2 minuti Android
- 25. argomento non valido per l'opzione '-resize' nello script di shell
- 26. Registrazione di prefissi con la data nello script di shell
- 27. Directory di modifica dello script della shell con variabile
- 28. Crontab ogni 5 minuti
- 29. come manipolare la matrice nello script di shell
- 30. Esegui un singolo comando nello script di shell senza sudo
Supponendo che "unix" significhi "Linux" qui. –
Sì, ma non funziona con la condivisione di Windows CIFS montata su Linux. – Meloman