wget não está obtendo listagem completa de diretórios

wget não está obtendo listagem completa de diretórios

Procurei por todos os lados e não consegui encontrar uma resposta para o meu problema. Não tenho certeza se este é o fórum adequado, mas espero que alguém aqui possa ajudar.

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

Posso executar um script no servidor remoto e obter uma listagem completa de diretórios (ls) em um arquivo e baixá-lo para minha máquina local.

É possível alimentar este arquivo para o wget e fazer com que ele espelhe esses arquivos em minha unidade local, como fazia antes de atingir o limite de listagem? Gostaria que o wget lesse a lista gerada e verificasse os arquivos alterados e adicionados. Aqui estão as perguntas para as quais não consegui encontrar respostas:

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

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

Responder1

Você pode fazer isso, o único problema é obter uma saída deeuisso é o mesmo no controle remoto e na sua máquina local. Meu ls tem uma opção --estilo de tempo=+%sque mostra a hora da última modificação do arquivo em segundos desde a época, que deve corresponder nas duas máquinas. Presumo que você queira fazer isso apenas para um diretório; caso contrário, findseria mais apropriado se você tivesse 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 remoto /tmp/listfilepara local /tmp/listfilee use estranhopara suprimir as primeiras 4 colunas de saída e classificar a lista de tamanho, data e nome do arquivo. (Presumo que você possa 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 classificadas e elimine as linhas que são iguais a comunicação. Elimine as colunas de tamanho e data (e, incidentalmente, a tabulação no início das linhas em /tmp/b e não em /tmp/a, e 2 espaços entre colunas) e elimine nomes de arquivos duplicados comúnico. (Você não precisa classificar novamente, pois as 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 contém todos os arquivos novos, de tamanho ou carimbo de data/hora diferentes ou que foram removidos. Passe cada um para o wget buscar (ainda no 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 seu espelho wget para não buscar mais este diretório.

Se você puder fazer isso find ... -printf '%9s %T+ %p\n', poderá usar esse tipo de técnica, começando no topo do diretório de espelhos, para fazer o espelhamento você mesmo com eficácia.

informação relacionada