البرنامج النصي باش:تنزيل ملفات مرقمة متتالية باستخدام wget

StackOverflow https://stackoverflow.com/questions/1426522

  •  07-07-2019
  •  | 
  •  

سؤال

لدي خادم ويب يحفظ ملفات السجلات الخاصة بتطبيق الويب مرقمة.مثال على اسم الملف لهذا سيكون:

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 على التوالي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top