
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 wget
regresa true
, por lo que se omite la segunda parte. SiXno existe, wget
devuelve 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 wget
tuviera 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 wget
de 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 --reject
lista. 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 IFS
variable 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.