مقدمه

سریال یا بازی که میخوام دانلود کنم باید چندین فایل پشتسر هم و به ترتیب دانلود بشه. الگوی لینک دانلودشون هم مشابه همه و فقط در یک شماره که ترتیب رو مشخص میکنه با هم تفاوت دارن. مثلاً:
https://example.com/Better.Call.Saul.S05E01.mkv
https://example.com/Better.Call.Saul.S05E02.mkv
https://example.com/Better.Call.Saul.S05E03.mkv
...
https://example.com/Better.Call.Saul.S05E10.mkv
میخوام خیلی سریع و ساده همهٔ فایلها رو دانلود کنم. راه حل اصولیش اینه که بشینیم یک اسکریپت بنویسیم که url بگیره، صفحه رو scrape، لینکهای دانلود رو استخراج و دانلود کنه. قطعاً کلی ابزار آماده هم برای این کار وجود داره. ولی از اونجایی که حوصلهٔ اسکریپتنویسی و تمایل استفاده از ابزارهای دیگه رو ندارم، دوست دارم با ابزارهای سادهٔ گنو این کار رو انجام بدم. تنها کاری که باید بکنیم اینه که تمامی لینکها رو به ترتیب شمارشون تولید کنیم. بعدش میشه با ابزاری مثل wget [۱] به راحتی دانلودشون کرد.
ایدهٔ اولیه: استفاده از brace expantion
اولین چیزی که به ذهنم رسید استفاده از brace expantion [۲] برای تولید لینکها بود (چون شمارهٔ لینکها zero pad هستن 01 گذاشتم. همچنین از اونجایی که echo از کاراکتر فاصله برای جدا کردن خروجی استفاده میکنه، یک پردازش نهایی با tr هم لازمه):
> echo https://example.com/Better.Call.Saul.S05E{01..10}.mkv | tr ' ' "\n"
https://example.com/Better.Call.Saul.S05E01.mkv
https://example.com/Better.Call.Saul.S05E02.mkv
https://example.com/Better.Call.Saul.S05E03.mkv
https://example.com/Better.Call.Saul.S05E04.mkv
https://example.com/Better.Call.Saul.S05E05.mkv
https://example.com/Better.Call.Saul.S05E06.mkv
https://example.com/Better.Call.Saul.S05E07.mkv
https://example.com/Better.Call.Saul.S05E08.mkv
https://example.com/Better.Call.Saul.S05E09.mkv
https://example.com/Better.Call.Saul.S05E10.mkv
همچنین با printf هم میشه، نیاز به tr هم نیست.
printf "https://example.com/Better.Call.Saul.S05E%02d.mkv\n" {01..10}
حالا که تونستیم لینکها رو تولید کنیم کافیه با wget دانلودشون کنیم. بسته به سرور، امکان داره که خطای 403 بگیریم. برای حل این مشکل کافیه یک user-agent برای wget تنظیم کنیم.
> wget -P ~/Downloads --user-agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' https://example.com/Better.Call.Saul.S05E{01..10}.mkv | tr ' ' "\n"
کار ما با brace expantion به خوبی راه میافته ولی حین انجام اینکار با دستور seq هم آشنا شدم که دونستناش خالی از لطف نیست.
روش دوم: seq
با دستور seq میتونیم دنبالهای از اعداد تولید کنیم. ویژگی جالبش آرگومان -w هست که خروجی رو zero pad میکنه.
> seq -w 1 10
01
02
03
04
05
06
07
08
09
10
حالا کافیه for بزنیم و باقی آدرس لینک دانلود رو بهش بچسبونیم:
for i in $(seq -w 1 10); do
echo "https://example.com/Better.Call.Saul.S05E$i.mkv"
done
https://example.com/Better.Call.Saul.S05E01.mkv
https://example.com/Better.Call.Saul.S05E02.mkv
https://example.com/Better.Call.Saul.S05E03.mkv
https://example.com/Better.Call.Saul.S05E04.mkv
https://example.com/Better.Call.Saul.S05E05.mkv
https://example.com/Better.Call.Saul.S05E06.mkv
https://example.com/Better.Call.Saul.S05E07.mkv
https://example.com/Better.Call.Saul.S05E08.mkv
https://example.com/Better.Call.Saul.S05E09.mkv
https://example.com/Better.Call.Saul.S05E10.mkv
حالا که تونستیم لینکها رو به درستی تولید کنیم، کافیه با wget دانلودشون کنیم.
for i in $(seq -w 1 10); do
wget -P ~/Downloads "https://example.com/Better.Call.Saul.S05E$i.mkv"
done
بسته به سرور، امکان داره که خطای 403 بگیریم. برای حل این مشکل کافیه یک user-agent برای wget تنظیم کنیم.
for i in $(seq -w 1 10); do
wget -P ~/Downloads --user-agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' "https://example.com/Better.Call.Saul.S05E$i.mkv"
done
و تمام؛ همهٔ فایلها به ترتیب دانلود میشن.
مراجع
[۱] https://www.gnu.org/software/wget/
[۲] https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html