Wget: ¿si/si no, condición de descarga?

Wget: ¿si/si no, condición de descarga?

Quiero que wget prefiera un determinado tipo de archivo sobre otro, si los archivos tienen el mismo nombre base.

Por ejemplo:

sifoo.oggdisponible, no descargarfoo.mp3


la forma en que uso wget hasta ahora para rastrear/descargar automáticamente (si alguien está interesado):

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.ogg,.mp3 http://www.foo.com/folder/

pero esto, por supuesto,me pone .mp3 Y .oggarchivos. ¿Algunas ideas?

  • (Sintaxis-Explicación:
    -D: descargar solo desde este dominio
    -I: descargar solo desde esta subcarpeta del dominio
    -r: recursivo (siga los enlaces y la estructura del directorio)
    -l 1: siga solo 1 enlace profundo
    -nc: sin clobber = descargar sólo si el archivo no existe
    -A: aceptar/descargar sólo todos los *.ogg y *.mp3 (descartar los archivos html necesarios)
    (-i (opcionalmente delante de la URL): lee las URL de la URL, pero también descarga otras tipos de archivos como .png que no deseaba en primer lugar/los descarta después)

Respuesta1

Archivos individuales

Para lograr "Si el archivoXexiste, descárgalo; de lo contrario descargar el archivoy", puedes hacer lo siguiente:

wget x || wget y

SiXexiste, se descarga y wgetregresa true, por lo que se omite la segunda parte. SiXno existe, wgetdevuelve algún código de error (probablemente 8) y se evalúa la segunda parte de la expresión (que descargay).

Recursivamente

Sin embargo, obviamente eso no te ayudará mucho para tu descarga recursiva. Me sorprendería si wgettuviera las instalaciones para permitir el uso de mascarillas con este nivel de sofisticación. La página de manual tampoco parece cubrir ningún tipo de condicionales sofisticados. Sin embargo, un enfoque ligeramente modificado podría funcionar.

(Parece difícil convencerlo wgetde que produzca una lista de cosas que quiere descargar. Mi primera idea fue crear esto y filtrarlo adecuadamente antes de descargarlo, como sugiere @utkuerd).

Naturalmente, un punto de partida sería descargar primero todos los archivos ogg, presumiblemente mediante

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.ogg -i http://www.foo.com/folder/

Los archivos mp3 restantes se pueden descargar mediante el mismo método, siempre que tenga una máscara adecuada para proporcionar como --rejectlista. Esta lista debe contener el nombre de cada archivo mp3 que no desea descargar.

Suponiendo que le sugiero que cree esta lista de la siguiente manera

bl=($(find ./ -name '*.ogg' -exec basename -s .ogg {} \+ | sed 's/\(^.\+$\)/\1.mp3/' ) )

Ahora tiene una matriz bash de archivos mp3 para bloquear.

Para descargar sólo los archivos mp3 desbloqueados, puedes utilizar

IFS=','; wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.mp3 -R"${bl[*]}" -i http://www.foo.com/folder/; unset IFS

La IFSvariable debe modificarse para que la lista no esté separada por espacios.

Obviamente, esto irá mal en diversos grados si la lista de archivos ogg es más larga que getconf ARG_MAX(romperá el comando wget) o los nombres de archivos contienen espacios en blanco (romperá la lista de bloqueo, lo que potencialmente le dará un archivo adicional y (poco probable) un archivo faltante). archivo). Ambos son reparables.

Tenga en cuenta que las comas superfluas en la lista de rechazos daninteresanteresultados.

Reseña de la excelente sugerencia de @Bob

(ver comentario a continuación)

Después de obtener los archivos ogg con

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.ogg -i http://www.foo.com/folder/

Podrías crear archivos mp3 ficticios como este.

find ./ -name '*.ogg' | sed 's/ogg$/mp3/' | xargs -d '\n' touch 

y obtener los archivos mp3 restantes con (explotar -nc)

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.mp3 -i http://www.foo.com/folder/

Los archivos mp3 superfluos se pueden eliminar con algo como

find ./ -name '*.mp3' -size 0 -exec rm '{}' \+

Probé que esto funciona con espacios en los nombres.

Respuesta2

No creo que una opción de wget tenga el poder de elegir entre patrones de nombres de archivos determinados de forma inteligente. Lo más probable es que necesites un guión para lograr lo que deseas. Debe buscar la lista del directorio, analizarla usted mismo y luego descargar los archivos que desee.

Para descargar y descartar archivos .png, utilizó el indicador -i incorrectamente. -i indicador especifica un archivo (o URL) que contiene las URL que se descargarán. Debes especificar el punto de partida sin ninguna bandera. Si elimina el indicador -i, no se descargarán otros tipos de archivos, solo los archivos .ogg, .mp3 y html necesarios. Los archivos html se descartan después.

información relacionada