Como fazer wget download recursivo combinando --accept com --exclude-directories?

4

Estou tentando baixar alguns diretórios de um servidor Apache, mas preciso ignorar alguns diretórios que possuem arquivos enormes que não me interessam

A estrutura dir no servidor é um pouco assim (simplificada):

somedir/
├── atxt.txt
├── big_file.pdf
├── image.jpg
└── tmp
    └── tempfile.txt

Portanto, quero obter todos os arquivos .txt e .jpg , mas NÃO quero os arquivos .pdf nem nada que esteja em um diretório tmp .

Eu tentei usar --exclude-directories junto com --accept e, em seguida, com --reject , mas nas duas tentativas ele continua baixando o tmp dir e seu conteúdo.

Estes são os comandos que eu tentei:

# with --reject
wget -nH --cut-dirs=2 -r --reject=pdf --exclude-directories=tmp \
         --no-parent  http://<host>/pub/somedir/

# with --accept
wget -nH --cut-dirs=2 -r --accept=txt,jpg --exclude-directories=tmp \
         --no-parent  http://<host>/pub/somedir/

Existe uma maneira de fazer isso?

Como exatamente o --exclude-directories deveria funcionar?

    
por elias 07.02.2014 / 16:06

3 respostas

4

Em vez de tentar fazer isso usando wget , sugiro usar uma ferramenta mais apropriada para baixar "conjuntos" complexos de arquivos ou filtros.

Você pode usar httrack para baixar diretórios inteiros de arquivos (essencialmente espelhar tudo de um site) ou pode especificar httrack um filtro junto com extensões de arquivo específicas, como o download apenas de .pdf files.

Você pode ler mais sobre o recurso de filtro httrack que é o que você precisa usar se você estivesse interessado em baixar apenas arquivos que foram nomeados de uma maneira específica.

Aqui estão alguns exemplos do recurso de curinga:

  • *[file] ou *[name] - qualquer nome de arquivo ou nome, por exemplo não /,? e; caracteres
  • *[path] - qualquer caminho (e nome de arquivo), por exemplo não ? e; caracteres
  • *[a,z,e,r,t,y] - qualquer letra entre a, z, e, r, t, y
  • *[a-z] - qualquer letra
  • *[0-9,a,z,e,r,t,y] - quaisquer caracteres entre 0..9 e a, z, e, r, t, y

Exemplo

$ httrack http://url.com/files/ -* +1_[a-z].doc -O /dir/to/output

Os comutadores são os seguintes:

  • -* - remova tudo da lista de coisas para fazer o download
  • +1_[a-z].doc - faça o download de arquivos com o nome 1_a.doc, 1_b.doc, etc.
  • -O /dir/to/output - escreve os resultados aqui
por 07.02.2014 / 16:14
0

Eu tive um caso semelhante em que fiz o equivalente ao que seria para você --exclude-directories '/tmp' e funcionou para mim.

Veja também link para opções mais poderosas no wget recente (expressões regulares).

    
por 22.10.2014 / 11:46
0

Muitos me incluindo tiveram problemas para descobrir como usar -X, e acharam a resposta difícil de lembrar (entre anos de intervalo entre o uso).

Esse é um truque difícil de lembrar:

$ wget -X fo*o ... # does not work for directories
$ wget -X */fo*o,*/*/fo*o,*/*/*/fo*o ... # works for directories
$ wget -X \*/fo\*o/,\*/\*/fo\*o/,\*/\*/\*/fo\*o/ ...

RESPOSTA:

site hack wget -? / src / utils.c para usar o basename em vez do caminho atual, também na linha de comando use o nome do arquivo padrão (apenas 'fo * o', nada mais). e observe o parâmetro FNM_PATHNAME definido como 0 (caso contrário, será necessário '/' para concluir o final da correspondência). o patch a seguir é contra o wget-1.12 ai meu ser uma maneira mais simples definindo? FNM_FLAGS mas isso funciona "bem".

--- utils.c.old 2016-09-13 07:49:11.000000000 -0400
+++ utils.c 2016-09-13 09:32:58.000000000 -0400
@@ -907,6 +907,9 @@
   return *d1 == '
$ wget -X fo*o ... # does not work for directories
$ wget -X */fo*o,*/*/fo*o,*/*/*/fo*o ... # works for directories
$ wget -X \*/fo\*o/,\*/\*/fo\*o/,\*/\*/\*/fo\*o/ ...
' && (*d2 == '
--- utils.c.old 2016-09-13 07:49:11.000000000 -0400
+++ utils.c 2016-09-13 09:32:58.000000000 -0400
@@ -907,6 +907,9 @@
   return *d1 == '%pre%' && (*d2 == '%pre%' || *d2 == '/');
 }

+/* for basename */
+#include <libgen.h>
+
 /* Iterate through DIRLIST (which must be NULL-terminated), and return the
    first element that matches DIR, through wildcards or front comparison (as
    appropriate).  */
@@ -921,18 +924,24 @@
     {
       /* Remove leading '/' */
       char *p = *x + (**x == '/');
+      /* SITE HACK - only if patterned ignore leading dirs cmp as file */
+      char sh_str[1024*16], *pp;
+      strcpy(sh_str,basename(dir));
+      pp=sh_str;
+#if 0
+      printf("? %s == %s ?\n",p,pp); 
+#endif
       if (has_wildcards_p (p))
         {
-          if (matcher (p, dir, FNM_PATHNAME) == 0)
+          if (matcher (p, pp, 0) == 0)
             break;
         }
       else
         {
-          if (subdir_p (p, dir))
+          if (subdir_p (p, pp))
             break;
         }
     }
-
   return *x ? true : false;
 }
' || *d2 == '/'); } +/* for basename */ +#include <libgen.h> + /* Iterate through DIRLIST (which must be NULL-terminated), and return the first element that matches DIR, through wildcards or front comparison (as appropriate). */ @@ -921,18 +924,24 @@ { /* Remove leading '/' */ char *p = *x + (**x == '/'); + /* SITE HACK - only if patterned ignore leading dirs cmp as file */ + char sh_str[1024*16], *pp; + strcpy(sh_str,basename(dir)); + pp=sh_str; +#if 0 + printf("? %s == %s ?\n",p,pp); +#endif if (has_wildcards_p (p)) { - if (matcher (p, dir, FNM_PATHNAME) == 0) + if (matcher (p, pp, 0) == 0) break; } else { - if (subdir_p (p, dir)) + if (subdir_p (p, pp)) break; } } - return *x ? true : false; }
    
por 14.09.2016 / 03:49

Tags