البرنامج النصي باش:تنزيل ملفات مرقمة متتالية باستخدام wget
سؤال
لدي خادم ويب يحفظ ملفات السجلات الخاصة بتطبيق الويب مرقمة.مثال على اسم الملف لهذا سيكون:
dbsclog01s001.log
dbsclog01s002.log
dbsclog01s003.log
الأرقام الثلاثة الأخيرة هي العداد ويمكن أن تصل في وقت ما إلى 100.
عادةً ما أقوم بفتح متصفح الويب، وتصفح للوصول إلى الملف مثل:
http://someaddress.com/logs/dbsclog01s001.log
وحفظ الملفات.هذا بالطبع يصبح مزعجًا بعض الشيء عندما تحصل على 50 سجلًا.لقد حاولت التوصل إلى برنامج نصي BASH لاستخدام wget والتمرير
http://someaddress.com/logs/dbsclog01s*.log
لكني أواجه مشاكل مع البرنامج النصي الخاص بي.على أي حال، أي شخص لديه عينة حول كيفية القيام بذلك؟
شكرًا!
المحلول
#!/bin/sh
if [ $# -lt 3 ]; then
echo "Usage: $0 url_format seq_start seq_end [wget_args]"
exit
fi
url_format=$1
seq_start=$2
seq_end=$3
shift 3
printf "$url_format\\n" `seq $seq_start $seq_end` | wget -i- "$@"
وحفظ أعلاه، seq_wget
، وإعطائها إذن التنفيذ (chmod +x seq_wget
)، ثم قم بتشغيل، على سبيل المثال:
$ ./seq_wget http://someaddress.com/logs/dbsclog01s%03d.log 1 50
وأو، إذا كان لديك باش 4.0، هل يمكن أن اكتب فقط
$ wget http://someaddress.com/logs/dbsclog01s{001..050}.log
وأو، إذا كنت قد curl
بدلا من wget
، هل يمكن أن تتبع الجواب دنيس وليامسون.
نصائح أخرى
وcurl
يبدو لدعم نطاقات. من الصفحة man
:
URL The URL syntax is protocol dependent. You’ll find a detailed descrip‐ tion in RFC 3986. You can specify multiple URLs or parts of URLs by writing part sets within braces as in: http://site.{one,two,three}.com or you can get sequences of alphanumeric series by using [] as in: ftp://ftp.numericals.com/file[1-100].txt ftp://ftp.numericals.com/file[001-100].txt (with leading zeros) ftp://ftp.letters.com/file[a-z].txt No nesting of the sequences is supported at the moment, but you can use several ones next to each other: http://any.org/archive[1996-1999]/vol[1-4]/part{a,b,c}.html You can specify any amount of URLs on the command line. They will be fetched in a sequential manner in the specified order. Since curl 7.15.1 you can also specify step counter for the ranges, so that you can get every Nth number or letter: http://www.numericals.com/file[1-100:10].txt http://www.letters.com/file[a-z:2].txt
وربما لاحظتم أن تقول "مع الأصفار البادئة"!
ويمكنك استخدام تسلسل نوع الصدى في رابط مجلد مشترك لتحميل السلسلة من الأرقام ...
وwget http://someaddress.com/logs/dbsclog01s00{1..3}.log
وهذا يعمل أيضا مع خطابات
و{a..z} {A..Z}
ويمكنك استخدام مزيج من لحلقة ط ن وسحق مع و printf الأوامر (بتعديل بالطبع echo
إلى wget
حسب الحاجة):
$ for i in {1..10}; do echo "http://www.com/myurl`printf "%03d" $i`.html"; done
http://www.com/myurl001.html
http://www.com/myurl002.html
http://www.com/myurl003.html
http://www.com/myurl004.html
http://www.com/myurl005.html
http://www.com/myurl006.html
http://www.com/myurl007.html
http://www.com/myurl008.html
http://www.com/myurl009.html
http://www.com/myurl010.html
ولست متأكدا بالضبط ما هي المشاكل التي تعاني، ولكن هذا يبدو وكأنه بسيط للحلقة في باش سوف نفعل ذلك لك.
for i in {1..999}; do
wget -k http://someaddress.com/logs/dbsclog01s$i.log -O your_local_output_dir_$i;
done
ومهمة مثيرة للاهتمام، لذلك كتبت السيناريو الكامل لك (عدة إجابات جنبا إلى جنب وأكثر من ذلك). ومن هنا:
#!/bin/bash
# fixed vars
URL=http://domain.com/logs/ # URL address 'till logfile name
PREF=logprefix # logfile prefix (before number)
POSTF=.log # logfile suffix (after number)
DIGITS=3 # how many digits logfile's number have
DLDIR=~/Downloads # download directory
TOUT=5 # timeout for quit
# code
for((i=1;i<10**$DIGITS;++i))
do
file=$PREF`printf "%0${DIGITS}d" $i`$POSTF # local file name
dl=$URL$file # full URL to download
echo "$dl -> $DLDIR/$file" # monitoring, can be commented
wget -T $TOUT -q $dl -O $file
if [ "$?" -ne 0 ] # test if we finished
then
exit
fi
done
وفي beggiing البرنامج النصي يمكنك وضع URL، تسجيل بادئة ملف واللاحقة، كم عدد الأرقام لديك في عددها جزء والدليل تنزيل. وحلقة تحميل جميع ملفات أرشفة وجدت، وبالعمل تلقائيا الخروج على الأول غير متوفرة (باستخدام مهلة مجلد مشترك ل).
لاحظ أن هذا السيناريو يفترض أن ملف السجل الفهرسة تبدأ ب 1، غير الصفر، كما ذكرت في المثال.
وآمل أن يساعد هذا.
هنا يمكنك العثور على برنامج Perl النصي الذي يبدو كما تريد
http://osix.net/modules/article/?id=677
#!/usr/bin/perl
$program="wget"; #change this to proz if you have it ;-)
my $count=1; #the lesson number starts from 1
my $base_url= "http://www.und.nodak.edu/org/crypto/crypto/lanaki.crypt.class/lessons/lesson";
my $format=".zip"; #the format of the file to download
my $max=24; #the total number of files to download
my $url;
for($count=1;$count<=$max;$count++) {
if($count<10) {
$url=$base_url."0".$count.$format; #insert a '0' and form the URL
}
else {
$url=$base_url.$count.$format; #no need to insert a zero
}
system("$program $url");
}
لقد ألقيت للتو نظرة على مناقشة صفحة wget حول "الجلوب":
افتراضيًا، سيتم تشغيل اللمعان إذا كان عنوان URL يحتوي على حرف متلألئ.يمكن استخدام هذا الخيار لتشغيل اللمعان أو إيقافه بشكل دائم.قد يتعين عليك اقتباس عنوان URL لحمايته من التوسيع بواسطة الصدفة الخاصة بك.يجعل Globbing Wget يبحث عن قائمة دليل خاصة بالنظام. ولهذا السبب فهو يعمل حاليًا فقط مع خوادم Unix FTP (والتي تحاكي إخراج Unix "ls").
إذن، http://...لن تعمل مع globbing.
وتحقق لمعرفة ما إذا كان لدى النظام وما يليها، فإنه سيكون من السهل:
for i in $(seq -f "%03g" 1 10); do wget "http://.../dbsclog${i}.log"; done
وإذا كان النظام لديه ذرة الأمر بدلا من بعدها:
for i in $(jot -w "http://.../dbsclog%03d.log" 10); do wget $i; done
وأوه! هذه هي مشكلة مماثلة ركضت إلى عندما تعلم باش لأتمتة تحميل المانجا.
وشيء من هذا القبيل يجب أن تعمل:
for a in `seq 1 999`; do
if [ ${#a} -eq 1 ]; then
b="00"
elif [ ${#a} -eq 2 ]; then
b="0"
fi
echo "$a of 231"
wget -q http://site.com/path/fileprefix$b$a.jpg
وبه
وفي وقت متأخر إلى الحزب، ولكن حل سهل الحقيقي الذي لا يتطلب أي ترميز لاستخدام DownThemAll فايرفوكس الإضافة، التي لديها وظائف لاسترداد يتراوح من الملفات. وهذا هو بلدي الحل عندما كنت في حاجة لتنزيل ملفات مرقمة 800 على التوالي.