Você pode fazer isso, o único problema é obter uma saída de ls que é o
mesmo no remoto e na sua máquina local. Meu ls tem uma opção
- time-style = +% s que mostra o horário da última modificação do arquivo em segundos
desde a época, que deve coincidir em ambas as máquinas. Eu estou supondo que você
só quero fazer isso para um diretório, caso contrário find
seria mais
apropriado se você tiver esse comando.
No controle remoto, faça o ls no diretório necessário em um arquivo:
cd ... # cd to the directory to list
ls -l --time-style=+%s . >/tmp/listfile
Na máquina local, copie o controle remoto /tmp/listfile
para local /tmp/listfile
e use
awk para suprimir as primeiras 4 colunas de saída e ordenar a lista de arquivos
tamanho, data e nome do arquivo. (Eu estou supondo que você pode ter nomes de arquivos com
espaços daí o bizarro awk).
awk '{$1="";$2="";$3="";$4="";print}' </tmp/listfile | sort >/tmp/a
No diretório espelhado, obtenha a mesma listagem:
cd ... # cd to same directory we listed remotely
ls -l --time-style=+%s . | awk '{$1="";$2="";$3="";$4="";print}' | sort >/tmp/b
Compare as duas listas ordenadas e elimine as linhas que são as mesmas com comm . Solte as colunas de tamanho e data (e, por acaso, a guia no início de linhas em / tmp / b não em / tmp / a e 2 espaços entre colunas) e solte nomes de arquivos duplicados com uniq . (Você não precisa classificar novamente como linhas duplicadas são adjacentes).
comm -3 /tmp/a /tmp/b | awk '{$1="";$2="";print substr($0,3)}' | uniq >/tmp/c
A lista em / tmp / c é todos os arquivos novos, de tamanhos ou timestamp ou foram removidos. Passe cada um para wget para buscar (ainda em o diretório apropriado).
while read file
do rm -f "$file"
wget -N --no-directories ..../"$file" # non recursive single file to .
done </tmp/c
Você deve configurar o seu espelho wget para não buscar mais este diretório.
Se você pode fazer find ... -printf '%9s %T+ %p\n'
, você pode usar esse tipo de
técnica, começando no topo do diretório espelho, para efetivamente fazer o
espelhando-se.