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 eventosCREATEeISDIR. Estamos salvando (comoline) e, em seguida, manipulando cada nova linha, indicando um evento relevante conforme eles acontecem. Por favor, verifiqueman inotifywaitpara ter mais ideia. -
parentconterá o diretório que estamos monitorando/home/tim/testneste caso echildconterá 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 eventoCREATEresultará na criação de um arquivo também, precisamos garantir quenewseja um diretório. -
[[ -d $new ]]verifica senewé um diretório, se assim for, então criamos o arquivo necessário dentro dele.