wget загружает файлы из списка файлов, как указать имена для каждого загруженного файла?

Когда вы запускаете контейнер Docker, вы работаете изолированно от вызывающей среды. Переменные не наследуются напрямую.

Мы можем увидеть «чистую» среду, которую мы можем увидеть, создав полностью минимальный контейнер.

напр. программа go:

package main
import "os"
import "fmt"

func main() {
    for _, e := range os.Environ() {
        fmt.Println(e)
    }
}

Мы можем превратить это в крошечный контейнер:

FROM scratch
ADD tester /
ENTRYPOINT ["/tester"]

И если мы запустим это:

$ docker run tst
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=e598bf727a26
HOME=/root

Это переменные, созданные механизмом Docker во время выполнения .

Таким образом, когда вы run.. /bin/shиспользуете не -оболочку входа в систему, которая просто наследует среду, созданную докером. Поскольку это не оболочка входа в систему, /etc/profileне запускается. /bin/shсам создаст некоторые переменные по умолчанию, если они не существуют.

$ docker run -it alpine                              
/ # env
HOSTNAME=51667ed06110
SHLVL=1
HOME=/root
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/

Есть несколько способов сделать это. В голове сразу две идеи:

Вы можете передавать переменные среды в командной строке docker с помощью -e.

$ docker run -e myvariable=testing -it alpine /bin/sh
/ # echo $myvariable
testing

Вы можете создать собственный образ на основе alpine с помощью команд ENV:

$ cat Dockerfile 
FROM alpine
ENV myothervar=anothertest

$ docker build -t myalpine.
...

$ docker run -it myalpine
/ # echo $myothervar
anothertest

По сути, вы видите, что среда выполнения docker предоставляет некоторые переменные, /bin/shпредоставляет другие переменные и изолируется от вызывающей среды.

3
06.05.2019, 21:25
2 ответа

Вы не можете сделать это одним вызовом Wget. Это вытекает из определения параметра Wget -O, который означает не просто имя сохраняемого файла, а скорее перенаправление оболочки stdout.

Если все имена файлов на сервере разные, вы все равно можете сделать это достаточно быстро, загрузив все файлы одним вызовом Wget, а затем переименовав их с помощью сценария оболочки.

Вы правы в том, что многократные вызовы wget будут медленными. Запуск и отключение процесса — это один аспект, но необходимость создания нового HTTP-соединения с сервером для каждого из файлов может очень быстро возрасти

.
1
27.01.2020, 21:24

Просто просмотрите файл построчно, прочитайте содержимое строки в переменную FOOи используйте ее как параметр wget:

while read FOO; do echo wget $FOO; done < filelist.txt

Это крошечное время для создания командной строки с параметрами не повредит вам по сравнению со временем загрузки. Для серверной стороны это не имеет никакого значения, если одни и те же или разные wgetпроцессы выполняют одиночные запросы на файлы, которые выполняются в обоих сценариях, то небольшое отключение Keep -Alive не будет иметь большого значения, на мой взгляд.

Кстати,:wgetвсегда однопоточный, нет параметра, чтобы сделать его многопоточным -. Возможно, вам стоит попробовать и посмотреть, насколько он медленнее на самом деле, запуская новый процесс wgetдля каждого URL-адреса, вместо того, чтобы использовать -iи надеяться, что он будет быстрее, так что вам не придется гадать, насколько медленнее, но просто посмотрите.
Также вы можете запустить несколько wgetпроцессов, подобно тому, как это видно в https://stackoverflow.com/questions/7577615/parallel-wget-in-bash/11850469#11850469(, просто передать больше параметров, чем там ), что должно ускорить все, для небольших файлов.

И вы по-прежнему можете переименовывать файлы после загрузки (, и это не совсем тот способ, которым вы просили )для достижения своей цели, если вам все равно нужно составить список имен целевых файлов.

1
27.01.2020, 21:24

Теги

Похожие вопросы