wget não está recebendo listagem completa do diretório

1

Eu caço alto e baixo e não consegui encontrar uma resposta para o meu problema. Não tenho certeza se esse é o fórum adequado, mas espero que alguém aqui possa ajudar.

Eu tenho usado o wget (FTP) para fazer backup do meu site no meu HD local, usando a opção de espelhamento, sem problemas, até recentemente. Recentemente, um diretório que contém imagens atingiu o limite, definido pelo serviço de hospedagem, para quantos itens podem estar em uma listagem de FTP. Eu não tenho acesso SSL à conta.

Eu posso executar um script, no servidor remoto, e obter uma lista completa de diretórios (ls), em um arquivo, e baixá-lo na minha máquina local.

É possível alimentar esse arquivo para wget e fazer com que ele espelhe esses arquivos na minha unidade local, como acontecia antes de atingir o limite de listagem? Eu gostaria que o wget lesse a lista gerada e verifique se há arquivos alterados e adicionados. Aqui estão as perguntas para as quais não consegui encontrar respostas:

1) Qual seria o comando apropriado para gerar as informações necessárias? Atualmente, estou recebendo apenas os nomes reais dos arquivos, mas tenho certeza de que é necessário mais.

2) A opção wget with mirror ainda funcionará com um arquivo de entrada ou fará o download de todos os arquivos no arquivo de entrada sem verificar o status alterado? Eu encontrei absolutamente nenhuma informação sobre esta combinação - apenas em um ou outro. Eu não quero testar e acabar obtendo um backup completo do diretório - desperdício de largura de banda e tempo para extrair todos esses dados.

    
por Mike S 16.06.2015 / 15:41

1 resposta

0

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.

    
por meuh 19.06.2015 / 18:54