Certifique-se de que o download não seja um engano

Certifique-se de que o download não seja um engano

Quero baixar (recursivamente) um diretório de arquivos para um local de um servidor WebDav. Se o arquivo já estiver presente (em algum lugar lá), ele não deverá ser baixado novamente. No entanto, a estrutura de pastas não é a mesma.

Existe uma maneira fácil de fazer isso? Pesquisei fdupes, mas é apenas para detecção e exclusão de ingênuos. Os arquivos são muito grandes e a sobrecarga seria grande demais.

O sistema de arquivos de destino não oferece suporte à desduplicação. Eu sei cp -n(de um ponto de montagem FUSE) que não substituiria os arquivos existentes, mas a estrutura da pasta não é a mesma. Então estou meio preso.

Responder1

De olhar paraos clientes Linux disponíveis para WebDAV, meu método preferido para fazer isso seria:

  1. Use GVFS ou um dos módulos do sistema de arquivos WebDAV (davfs2 ou fusedav) para "mapear" os arquivos do servidor WebDAV remoto no caminho do sistema de arquivos local.

  2. Use o integradoCPcomando para com a -nopção de instruí-lo a "não destruir" os arquivos no destino. Observe que certos shells, como dashno Ubuntu, executarão uma builtinversão de cppor padrão, e este built-in pode não suportar a -nopção. Para obter melhores resultados, certifique-se de estar executando a versão GNU Coreutils cpexecutando /bin/cpou /usr/bin/cp(dependendo de onde o binário está em seu sistema específico).

EDITAR: interpretei mal sua pergunta original.

Acho que o que você está dizendo é que você tem uma situação em que o arquivo file1.txtexiste em dois caminhos diferentes no servidor WebDAV, e oconteúdodesses dois arquivos é exatamente o mesmo. E como você já possui uma cópia do arquivo, não deseja baixar uma segunda ou terceira cópia do arquivo porque isso desperdiça largura de banda?

Bem,do lado do cliente, isso seria muito difícil de fazer. Aqui está o porquê.

Você tem que olharo que você está comparandopara determinar se o arquivo é exclusivo e orequisitos/custospara fazer essa comparação.

EUassumido(erroneamente) que o que você estava comparando é ocaminhoem relação à raiz da estrutura de pastas WebDAV. O custo de fazer uma comparação de igualdade de caminho é muito fácil: basta olhar para as duas strings de caminho, como /dir1/dir2/file1.txt, e ver se as strings correspondem. Se o fizerem, é uma duplicata. Se não o fizerem, não é.

Outra coisa que você pode comparar é o arquivonome, ignorando ocaminho. Então, por exemplo, você consideraria estes dois arquivos duplicados: /dir1/dir2/file1.txte /dir3/dir4/file1.txt? Bem, se você estáapenascomparando com base nonome, então estes seriam considerados duplicados. No entanto, podemos misturar e combinar vários testes de duplicação conforme desejarmos, a fim de fazer o tipo certo de teste para nosso caso de uso.

Outras propriedades menos úteis para comparar incluemtamanho do arquivo,atributos(também conhecido comometadados), extensão de arquivo, etc. Essas coisas não oferecem muito o que fazer em termos de poder de julgamento de duplicatas, porque na maioria dos casos, é fácil construir um arquivo que tenha as mesmas propriedades de outro arquivo, mas conteúdos totalmente diferentes , e a maioria das pessoas não consideraria os dois arquivos duplicados se o conteúdo fosse diferente.

Na minha opinião, a coisa mais importante que você pode comparar é o arquivoconteúdo. Infelizmente, do ponto de vista do cliente WebDAV, você não tem como saber o conteúdo do arquivo antes de baixá-lo. E no que diz respeito ao cliente, o conteúdo do arquivo pode mudar durante ou após a transferência do arquivo; nesse caso, os resultados da comparação duplicada mudariam se você baixasse o arquivo novamente.

Existem duas maneiras básicas de comparar o conteúdo do arquivo:byte por byte, ehash. Byte por byte é a maneira mais "garantida" de verificar duplicatas, mas sofre com a limitação de comparartodo o arquivo, que é extremamente lento para uma grande quantidade de dados. Considere também que a complexidade algorítmica básica da detecção de duplicatas é O(n^2), o que significa que você teria que comparar o conteúdo de cada arquivo com o conteúdo de cada outro arquivo para determinar se é uma duplicata. Usar um hash criptográfico para comparar os arquivos pode reduzir enormemente a quantidade de dados que precisam ser comparados ou transferidos, mas a desvantagem é que você introduz uma chance infinitamente pequena de que dois arquivos possam ser realmentediferentemas têm o mesmo hash - conhecido como colisão de hash.

Mas novamente, a partir doclienteperspectiva, não é possível sabero queo conteúdo do arquivo é, ou mesmo seu hash, a menos que você:

  • Baixe o arquivo do servidor; ou
  • Convença o servidor a calcular um valor de hash para você localmente e, em seguida, baixe o hash.

No primeiro caso, você está baixando o arquivo para determinar se ele é duplicado para evitar o download do arquivo, então você não pode fazer isso, obviamente - você está desperdiçando a largura de banda que está tentando evitarsó para fazer as comparações!

Neste último caso, você pode estar no caminho certo. Um hash SHA1 de um arquivo muito grande tem apenas alguns bytes e representa uma pequena fração do tamanho do arquivo grande. Seria bastante prático baixar hashes de todos os arquivos e fazer uma O(n^2)comparação doshashespara determinar qual arquivo baixar. Você ainda terá problemas de condição de corrida se os dados do arquivo forem alterados no servidor enquanto você faz essas comparações, portanto, certifique-se de levar a sincronização em consideração, se for importante para você.

Então, conclusão:

  • SEvocê não tem controle total de software sobre o servidor WebDAV e não consegue fazer alterações em sua configuração, você está praticamente sem sorte (tm) em determinar se já possui uma cópia do mesmoconteúdo do arquivoque são armazenados em vários arquivos no servidor,a menos queo administrador do servidor já disponibiliza algum tipo de arquivo hash para cada arquivo no servidor, o que pode permitir algum grau de sucesso se você puder confiar nos valores de hash.
  • SEvocêfazertêm controle total de software sobre o servidor WebDAV e sãocapazpara alterar sua configuração, você pode querer escrever um script ou programa (ou usar um já disponível) para criar um arquivo hash com uma extensão como, por exemplo, .sha1sumno mesmo diretório de todos os arquivos hospedados pelo servidor WebDAV. Isso pode permitir que você baixe apenas os hashes e compare-os, a um custo de largura de banda relativamente modesto em comparação com o tamanho dos arquivos, assumindo que seus arquivos tenham mais do que alguns kilobytes de tamanho.

informação relacionada