Jika Anda menggunakan ekspansi brace dengan wget
, Anda dapat mengambil gambar bernomor urut dengan mudah:
$ wget 'http://www.iqandreas.com/sample-images/100-100-color/'{90..110}'.jpg'
Ini mengambil pertama 10 file bernomor 90.jpg
untuk 99.jpg
baik-baik saja, tapi 100.jpg
dan seterusnya mengembalikan 404: File tidak ditemukan kesalahan (saya hanya memiliki 100 gambar yang tersimpan di server). File-file yang tidak ada ini menjadi lebih "masalah" jika Anda menggunakan rentang yang lebih besar, seperti {00..200}
, dengan 100 file yang tidak ada, itu meningkatkan waktu eksekusi skrip, dan bahkan mungkin menjadi sedikit beban (atau setidaknya gangguan) pada server.
Apakah ada cara untuk wget
berhenti setelah menerima kesalahan 404 pertama? (atau bahkan lebih baik, dua berturut-turut, kalau-kalau ada file yang hilang dalam kisaran karena alasan lain) Jawabannya tidak perlu menggunakan ekspansi penjepit; loop juga baik-baik saja.
sumber
1, 2 or even n failures
bukan cara yang benar ketika Anda tahu[begin .. end]
indeks. Mengapa Anda menentukan[1..200]
rentang ketika Anda tahu hanya ada 100 gambar di[1..100]
. Saya kira Anda dapat mencoba GNUparallel
untuk permintaan simultan untuk mempercepat proses.Jawaban:
Jika Anda senang dengan loop:
Itu akan berjalan
wget
untuk setiap URL dalam ekspansi Anda sampai gagal, dan kemudianbreak
keluar dari loop.Jika Anda ingin dua kegagalan berturut-turut, ini menjadi sedikit lebih rumit:
Anda bisa mengecilkan itu sedikit dengan
&&
dan||
bukannyaif
, tetapi itu menjadi sangat jelek.Saya tidak percaya
wget
ada sesuatu yang dibangun untuk melakukan itu.sumber
elif
untuk membuat contoh kedua lebih jelas? Mungkin sesuatu seperti ini? gist.github.com/IQAndreas/84cae3f0193b67691ff2 (itu hanya menambahkan satu baris tambahan, tidak termasuk menempatkanthen
s pada baris yang sama denganif
s)Anda bisa menggunakan
$?
variabel untuk mendapatkan kode pengembalian wget. Jika bukan nol maka berarti terjadi kesalahan dan Anda menghitungnya hingga mencapai ambang batas, maka itu bisa keluar dari loop.Sesuatu seperti ini dari atas kepalaku
Untuk loop dapat dibersihkan sedikit, tetapi Anda dapat memahami ide umum.
Mengubah
$threshold -eq 16
ke-eq 24
berarti itu akan gagal 3 kali sebelum akan berhenti, namun itu tidak akan menjadi dua kali berturut-turut, itu akan terjadi jika gagal dua kali dalam loop.Alasan mengapa
16
dan24
digunakan adalah itu adalah total kode pengembalian.wget merespons dengan kode pengembalian
8
ketika menerima kode respons yang sesuai dengan kesalahan dari server, dan dengan demikian16
total setelah 2 kesalahan.Menghentikan ketika kegagalan hanya terjadi dua kali berturut-turut dapat dilakukan dengan mengatur ulang ambang batas setiap kali
wget
berhasil, yaitu ketika kode kembali adalah 0Daftar kode pengembalian wget dapat ditemukan di sini - http://www.gnu.org/software/wget/manual/html_node/Exit-Status.html
sumber
8
, karenanya angka ajaib dari16
dan24
.$?
! Sangat berguna!Dengan GNU Parallel ini seharusnya berfungsi:
Dari versi 20140722 Anda hampir dapat memiliki "dua berturut-turut" -failure: --halt 2% akan memungkinkan 2% dari pekerjaan gagal:
sumber
IMO, yang memfokuskan pada
wget
kode keluar / status mungkin terlalu naif untuk beberapa kasus penggunaan, jadi di sini adalah salah satu yang mempertimbangkan Kode Status HTTP juga untuk beberapa pengambilan keputusan granular.wget
menyediakan-S/--server-response
bendera untuk mencetak Header Respons HTTP padaSTDERR
perintah - yang dapat kita ekstrak dan tindak lanjuti.sumber
Dengan python bisa Anda lakukan
Periksa dokumentasi untuk subproses jika Anda ingin melakukan lebih banyak https://docs.python.org/2/library/subprocess.html
sumber
check_output
ada sihir di sekitarwget
untuk mendeteksi404
- Saya tidak percaya ada pemeriksaan yang memadai di sini sehingga tidak benar-benar menjawab pertanyaan.