Para verificar se um arquivo está aberto no momento (se um arquivo está atualmente escrito com certeza é aberto por algum processo) a forma padrão é usar lsof
:
if lsof /your/file > /dev/null; then echo "file currently open"; fi
Você pode usar este snippet para filtrar os resultados de busca somente por arquivos não abertos e usá-los para alimentar o rsync:
find . -type f -exec sh -c 'if ! lsof 'readlink -f {}' > /dev/null; then echo 'basename {}'; fi' \; | tr '\n' 'if lsof /your/file > /dev/null; then echo "file currently open"; fi
' | rsync -avz --from0 --files-from=- ./ user@host:destination/
Algumas notas:
-
readlink -f
é necessário para ter o caminho completo de um arquivo, lsof aceita somente o caminho completo -
tr '\n' '
emulate encontra %code%-print0
'