Ответ 1
Трудно понять, чего именно вы хотите достичь. Позвольте мне попытаться перефразировать ваш вопрос.
У меня есть
urls.txt
, содержащий:http://example.com/dira/foo.jpg http://example.com/dira/bar.jpg http://example.com/dirb/foo.jpg http://example.com/dirb/baz.jpg http://example.org/dira/foo.jpg
В
example.com
эти URL-адреса существуют:http://example.com/dira/foo.jpg http://example.com/dira/foo_001.jpg http://example.com/dira/foo_003.jpg http://example.com/dira/foo_005.jpg http://example.com/dira/bar_000.jpg http://example.com/dira/bar_002.jpg http://example.com/dira/bar_004.jpg http://example.com/dira/fubar.jpg http://example.com/dirb/foo.jpg http://example.com/dirb/baz.jpg http://example.com/dirb/baz_001.jpg http://example.com/dirb/baz_005.jpg
В
example.org
эти URL существуют:http://example.org/dira/foo_001.jpg
Учитывая
urls.txt
, я хочу сгенерировать комбинации с _001.jpg.. _005.jpg в дополнение к исходному URL. Например:.http://example.com/dira/foo.jpg
становится:
http://example.com/dira/foo.jpg http://example.com/dira/foo_001.jpg http://example.com/dira/foo_002.jpg http://example.com/dira/foo_003.jpg http://example.com/dira/foo_004.jpg http://example.com/dira/foo_005.jpg
Затем я хочу проверить, существуют ли эти URL-адреса без загрузки файла. Поскольку есть много URL-адресов, я хочу сделать это параллельно.
Если существует URL-адрес, я хочу создать пустой файл.
(Версия 1): Мне нужен пустой файл, созданный в аналогичной структуре каталогов в каталоге
images
. Это необходимо, потому что некоторые изображения имеют одно и то же имя, но в разных каталогах.Таким образом, создаваемые файлы должны быть:
images/http:/example.com/dira/foo.jpg images/http:/example.com/dira/foo_001.jpg images/http:/example.com/dira/foo_003.jpg images/http:/example.com/dira/foo_005.jpg images/http:/example.com/dira/bar_000.jpg images/http:/example.com/dira/bar_002.jpg images/http:/example.com/dira/bar_004.jpg images/http:/example.com/dirb/foo.jpg images/http:/example.com/dirb/baz.jpg images/http:/example.com/dirb/baz_001.jpg images/http:/example.com/dirb/baz_005.jpg images/http:/example.org/dira/foo_001.jpg
(Версия 2): Мне нужен пустой файл, созданный в каталоге
images
. Это можно сделать, потому что все изображения имеют уникальные имена.Таким образом, создаваемые файлы должны быть:
images/foo.jpg images/foo_001.jpg images/foo_003.jpg images/foo_005.jpg images/bar_000.jpg images/bar_002.jpg images/bar_004.jpg images/baz.jpg images/baz_001.jpg images/baz_005.jpg
(Версия 3): Я хочу, чтобы пустой файл, созданный в каталоге
images
, назывался именем изurls.txt
. Это можно сделать, потому что существует только один из _001.jpg.. _005.jpg.images/foo.jpg images/bar.jpg images/baz.jpg
#!/bin/bash
do_url() {
url="$1"
# Version 1:
# If you want to keep the folder structure from the server (similar to wget -m):
wget -q --method HEAD "$url" && mkdir -p images/"$2" && touch images/"$url"
# Version 2:
# If all the images have unique names and you want all images in a single dir
wget -q --method HEAD "$url" && touch images/"$3"
# Version 3:
# If all the images have unique names when _###.jpg is removed and you want all images in a single dir
wget -q --method HEAD "$url" && touch images/"$4"
}
export -f do_url
parallel do_url {1.}{2} {1//} {1/.}{2} {1/} :::: urls.txt ::: .jpg _{001..005}.jpg
GNU Parallel занимает несколько мс на одно задание. Когда ваши задания будут такими короткими, накладные расходы повлияют на время. Если ни один из ваших ядер процессора не работает на 100%, вы можете запускать больше заданий параллельно:
parallel -j0 do_url {1.}{2} {1//} {1/.}{2} {1/} :::: urls.txt ::: .jpg _{001..005}.jpg
Вы также можете "развернуть" цикл. Это позволит сэкономить 5 накладных расходов для каждого URL-адреса:
do_url() {
url="$1"
# Version 2:
# If all the images have unique names and you want all images in a single dir
wget -q --method HEAD "$url".jpg && touch images/"$url".jpg
wget -q --method HEAD "$url"_001.jpg && touch images/"$url"_001.jpg
wget -q --method HEAD "$url"_002.jpg && touch images/"$url"_002.jpg
wget -q --method HEAD "$url"_003.jpg && touch images/"$url"_003.jpg
wget -q --method HEAD "$url"_004.jpg && touch images/"$url"_004.jpg
wget -q --method HEAD "$url"_005.jpg && touch images/"$url"_005.jpg
}
export -f do_url
parallel -j0 do_url {.} :::: urls.txt
Наконец, вы можете запустить более 250 заданий: https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Running-more-than-250-jobs-workaround