prename
подход:
prename -n 's/.*_(week.*$)/$1/' *_week*.pdf
$1
-указывает на 1-ю захваченную группу https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/предоставляет ссылку на самый новый файл. Можно загрузить html-документ сайта с помощью curl
, направить вывод для извлечения ссылки для загрузки (, сделанной ненадежным способом ниже с помощью grep
), и с помощью подстановки команд передать эту ссылку второму curl
команда.
curl -OJ \
$(curl -fs \
'https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/' | \
grep -om1 '[^"]*entry-download/[^"]*')
Надеюсь, это даст вам основу для дальнейшего развития.
grep
используемые варианты:
-o
/ --only-matching
для вывода только совпадающего шаблона вместо всей строки, содержащей шаблон -m 1
/ --max-count=1
прекращает поиск ввода после первой строки, содержащей совпадение
Шаблон для сопоставления:[^"]*entry-download/[^"]*
:все ссылки для скачивания, по-видимому, даны с href="https://www.transportfever.net/filebase/index.php?entry-download/<number><...>"
- поэтому приведенное выше сопоставление с шаблоном кажется достаточным :ноль или более любых символов, кроме двойных кавычек "
, за которыми следует entry-download/
, за которым снова следует ноль или более чего-либо, кроме"
curl
используемые опции (первый проход — внутри подстановки):
-f
/ --fail
ничего не выводить, если мы получили4/5xx
http-ответ — запрос не удался, мы не хотим выполнять grep html-документ, который сообщает нам, что он не удался -s
/ --silent
это первый проход,мы не хотим видеть индикатор выполнения или что-то в этом роде параметры второго прохода curl
— эти ссылки для скачивания используют заголовок content-disposition
, чтобы сообщить нам имя файла, поэтому:
-O
/ --remote-name
сохранить файл под тем же именем, что и удаленный файл -J
/ --remote-header-name
позволяет параметру -O
использовать указанный сервер -Контент -Имя файла диспозиции вместо извлечения имени файла из URL-адреса На самом деле существует более одной ссылки entry-download/
— чтобы загрузить все ссылки, мы можем удалить -m1
из grep
и настроить вторые параметры curl
для использования --remote-name-all
, например:
curl --remote-name-all -J \
$(curl -fs \
'https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/' | \
grep -o '[^"]*entry-download/[^"]*')
Если мы хотим заранее узнать имя файла, описанное заголовком content-disposition
, потребуется дополнительный шаг. Мы можем использовать curl для отправки запроса head
:
# get first url from the page, storing it to
# the parameter 'url' so we can use it again later
url=$(curl -fs \
'https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/' | \
grep -om1 '[^" ]*entry-download/[^" ]*')
# head request to determine filename
filename=$(curl -Is "$url" | grep -iom1 '^content-disposition:.*filename="[^"]*' | grep -o '[^"]*$')
# 'if' statement using the 'test' / '[' command as the condition
if test -e "$filename"; then
echo "$filename exists!"
else
# a file named $filename doesn't exit,
# so we'll download it
curl -o "$filename" "$url"
fi
curl -J
не будет перезаписывать существующие файлы, но я подозреваю, что вы хотите проверить наличие "$filename"
— возможно, без.zip
:"${filename%.zip}"
— в каком-то другом каталоге или, может быть, в каком-то тексте файл Основываясь на вышеизложенном, если вы хотите сделать это для всех извлеченных entry-download/
URL-адресов:
# extract all urls, placing them in an array parameter 'urls'
urls=( $(curl -fs \
'https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/' | \
grep -o '[^" ]*entry-download/[^" ]*') )
# loop over extracted urls
for i in "${urls[@]}"; do
# do filename extraction for "$i"
# use filename to determine if you want to download "$i"
done