Primeiro, crie um link simbólico para qualquer arquivo no diretório e chame-o de "mais recente":
ln -s somefile.jpg latest
Em seguida, execute o seguinte comando no diretório quantas vezes quiser:
find . -type f -newer latest -exec ln -fs {} latest \;
Isso é bem elegante, porque a sequência de avaliação não importa. No final deste comando latest
será um symlink para o arquivo mais novo no diretório. EDIT: Isso está errado. De acordo com POSIX :
The -user, -group, and -newer primaries each shall evaluate their respective arguments only once.
Isso praticamente invalida essa abordagem, mas você ainda pode fazer algo com isso. No entanto, dado esse fato, eu usaria inotify
como sugerido na outra resposta.
Eu não sei quantos ciclos de CPU ele queimaria, mas apenas em execução:
while true; do find . -type f -name '*.jpg' -newer latest -exec ln -fs {} latest \; ; done
garantirá que latest
sempre aponte para o arquivo jpeg mais recente, o mais rápido possível. Se você não espera novas imagens com mais frequência do que uma vez por segundo, você pode usar while sleep 1
em vez de while true
.
Observe que à medida que o número de arquivos em seu diretório aumenta, isso fica cada vez mais ineficiente. Eu tenho algumas idéias de como você pode lidar com isso, mas como é no ftp elas podem não ser aplicáveis.
Meu primeiro pensamento foi mover os arquivos mais antigos para outro diretório como parte do mesmo comando find
, para que eles não precisem ser avaliados novamente. O problema é que o arquivo que o símbolo latest
aponta para contar como "mais antigo", já que não é mais recente. Não podemos mover o arquivo ou quebraremos o link simbólico!
No entanto, como estamos avaliando apenas os arquivos com o nome .jpg, podemos contornar isso criando latest
a link físico em vez de um link simbólico:
mkdir ../oldfiles
while sleep 1; do find . -type f -name '*.jpg' \( -newer latest -exec ln -f {} latest \; -o -exec mv {} ../oldfiles \; \)
Mais uma vez, eu não sei como isso vai no ftp, mas para arquivos locais ele deve funcionar muito bem.