O problema com keepuptodate
é que ele executa toda a sincronização, que é lenta. Com um pouco de script, é possível fazer upload somente de arquivos alterados depois que eles são modificados.
Você pode usar FolderMon como um observador de pastas. Em seguida, processe sua saída pelo Gawk e, claro, use o WinSCP para fazer o upload. Todo o processo pode ser controlado por um script em lote simples:
Diretório local REM (recursivo).
REM% CD% - diretório de trabalho atual. Deve terminar com '\'.
defina "localPath =% CD% \"
REM Remote directory, must end with '/'
set "remotePath=/some/remote/directory"
REM Name of the stored session in WinSCP
set "[email protected]"
REM --------------------------------------------------------
REM Escape local path - replace '\' with '\'.
set "escapedLocalPath=%localPath:\=\%"
foldermon -lastwrite -subdirs %localPath% | ^
gawk -f autoupload.awk -v "localPath=%escapedLocalPath%" -v "remotePath=%remotePath%" -v "session=%session%" | ^
winscp.com /console | ^
gawk "{ if (!/#aaaaaaaaaaaaaaaaa/) print; }"
E é claro que você precisa desse script gawk ( autoupload.awk
):
INÍCIO {
# Variável para corrigir bug (recurso?) No foldermon.
# Quando o arquivo é salvo, o foldermon informa duas alterações no mesmo segundo.
lastLocalFile=""
lastTime=""
# Init and connect
print "#remotePath=", remotePath
print "#localPath=", localPath
print "#session=", session
print "option batch abort"
print "option confirm off"
print "open " session
print "option transfer binary"
#print "cd " remotePath
# Flush AWK buffer.
for (i=0; i<41; i++)
print "#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}
{
if (match ($0, /^([:0-9]*) File modified: (.*)$/, matchRow)) {
# File changed.
time = matchRow[1]
file = matchRow[2]
localFile = localPath file
# Don't upload same file twice immediately.
if (localFile!=lastLocalFile || lastTime!=time) {
lastLocalFile = localFile
lastTime = time
# Extract subdirectory from change report and convert '\' to '/'.
match (file, /^((.*[\])*).*$/, matchPath);
path = matchPath[1]
gsub(/\/, "/", path)
# Change remote dir and upload.
#print "cd " remotePath path
print "put", localFile, remotePath path
# Flush AWK buffer.
for (i=0; i<41; i++)
print "#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}
}
}
END {
# Disconnect.
print "close"
print "exit"
}
Você pode baixar o arquivo zip com tudo incluído em aqui .