32seph
@32seph

Как в Bash загрузить несколько файлов и склеить в один?

Нужно с нескольких сайтов взять некий контент и объединить все в один файл. Причем порядок должен быть соответствующим. Т. е. каждому сайту, например, соответствует номер 1, 2, 3...1000, в результирующем файле сначала должна быть инфа с 1-го сайта, потом со 2-го и т. д. (сначала записать с n-го сайта, потом с (n-k)-го недопустимо), ответы могут приходить в любом порядке, поэтому просто перенаправление в файл (>>) не подойдет.
Я написал такой скрипт:
rm -rf /tmp/content
mkdir /tmp/content

for i in ${!urls[@]}; do
	mkfifo /tmp/content/$i
	curl -s "${urls[$i]}" > /tmp/content/$i &
done

rm -f /tmp/output

for i in ${!urls[@]}; do
	cat /tmp/content/$i >> /tmp/output
done

rm -rf /tmp/livesport

Bash делает, что-то невероятное - вместо N параллельных запросов, каждый из которых выполнится за 1-2 сек (а значит вся закачка+сборка займет пару секунд), он делает запросы последовательно (пока один curl не закончит работу, следующий не начинает).
  • Вопрос задан
  • 134 просмотра
Решения вопроса 2
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
mkfifo /tmp/content/$i
  curl -s "${urls[$i]}" > /tmp/content/$i &

Bash делает, что-то невероятное - вместо N параллельных запросов, каждый из которых выполнится за 1-2 сек (а значит вся закачка+сборка займет пару секунд), он делает запросы последовательно

Ну учи матчасть, что ли. Ты заставил curl выводить результаты в FIFO вместо того, чтобы выводить их в файлы, а у FIFO совсем маленький буфер, после заполнения которого запись в FIFO блокируется, пока из него не начнётся чтение.
Если уж хотелось параллельности, можно было сделать так:
rm -rf /tmp/content
mkdir /tmp/content

for i in ${!urls[@]}; do
  curl -s "${urls[$i]}" > /tmp/content/$i &
done

wait
rm -f /tmp/output

for i in ${!urls[@]}; do
  cat /tmp/content/$i >> /tmp/output
done
Ответ написан
@pfg21
ex-турист
может просто сливать файлы на tmpfs-раздел (они будут такде висеть в ram как и у fifo, пока не удалятся) и оттуда собирать в файл ??
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы