Eu usaria a API inotify
fornecida pelo kernel para monitorar eventos do sistema de arquivos. Não há necessidade de um loop while
indefinido, você pode usar uma ferramenta que usa a interface fornecida pelo kernel para verificar quaisquer alterações em qualquer arquivo.
Uma das ferramentas que usa inotify
é inotifywait
. De man inotifywait
:
inotifywait efficiently waits for changes to files using Linux's inotify interface.
Ele não é instalado por padrão, é uma parte do pacote inotify-tools
. Você pode instalá-lo por:
sudo apt-get install inotify-tools
O roteiro que estou tomando pode ter a seguinte forma:
#!/bin/bash
while IFS= read -r line; do
parent="${line%% *}"
child="${line##* }"
new="${parent}${child}"
[[ -d $new ]] && touch "$new"/"$child".md
done < <(inotifywait --quiet --monitor --event CREATE,ISDIR /home/tim/test)
Você pode enviá-lo para o plano de fundo:
./dir_event.sh &
Ou talvez use nohup
ou disown
se você quiser:
nohup ./dir_event.sh &
-
inotifywait --quiet --monitor --event CREATE,ISDIR /home/tim/test
é o comando para monitorar os eventos do sistema de arquivos no diretório/home/tim/test
, estamos interessados apenas nos eventosCREATE
eISDIR
. Estamos salvando (comoline
) e, em seguida, manipulando cada nova linha, indicando um evento relevante conforme eles acontecem. Por favor, verifiqueman inotifywait
para ter mais ideia. -
parent
conterá o diretório que estamos monitorando/home/tim/test
neste caso echild
conterá o diretório / arquivo recém-criado. Ambos são alcançados usando a expansão do parâmetrobash
. -
new
é a adição dos dois para obter o caminho absoluto para a entrada recém-criada. Como o eventoCREATE
resultará na criação de um arquivo também, precisamos garantir quenew
seja um diretório. -
[[ -d $new ]]
verifica senew
é um diretório, se assim for, então criamos o arquivo necessário dentro dele.