ダウンロードしたい画像へのリンクのリストを含む.txtファイルがあるとします。例:
image.jpg
image2.jpg
image3.jpg
私が使用するもの:cat images.txt | xargs wget
そしてそれはうまくいきます
今やりたいことは、次の形式の別の.txtファイルを提供することです。
some_id1 image.jpg
some_id2 image2.jpg
some_id3 image3.jpg
私がやりたいことは、 ''内の各行を分割し、右側のリンクをダウンロードしてから、左側のIDを使用してダウンロードしたファイルの名前を変更することです。
個々の行ごとに何とかwget image.jpg -O some_id1.jpgを使用したいと思います。
したがって、出力は次のようになります。
some_id1.jpg
some_id2.jpg
some_id3.jpg
どんなアイデアがありますか?
答え1
これはあなたの仕事をすることができます
while read a b
do
wget "$b" -O "$a".jpg
printf "$a".jpg"\n%s" >> newfile
done < images.txt
答え2
テストするには:
$ awk '{ ext=gensub(/.*(\.[^.]*$)/,"\\1",1);
print "wget " $2 " -O " $1 ext}' images.txt
wget image.jpg -O some_id1.jpg
wget image2.jpg -O some_id2.jpg
wget image3.jpg -O some_id3.jpg
実行するにはパイプを入力するbash
か、sh
次のように入力します。
awk '{ ext=gensub(/.*(\.[^.]*$)/,"\\1",1);
print "wget " $2 " -O " $1 ext}' images.txt |
bash
必要に応じて、印刷ステートメントに一重引用符を追加します(たとえば、フィールドがタブで区切られ、フィールドにシェルに問題を引き起こすスペースやその他の文字が含まれる場合など)。またはフィールド2の&記号&
、セミコロン;
などの完全なURL)。例えば
awk '{ ext=gensub(/.*(\.[^.]*$)/,"\\1",1);
print "wget '\''" $2 "'\'' -O '\''" $1 ext"'\''"}' images.txt
wget 'image.jpg' -O 'some_id1.jpg'
wget 'image2.jpg' -O 'some_id2.jpg'
wget 'image3.jpg' -O 'some_id3.jpg'
ちなみに、一重引用符で囲まれた文字列に一重引用符を挿入する方法は次のとおりです。 ('\''
一重引用符の終わり、バックスラッシュでエスケープされた一重引用符、一重引用符を再開)
追加情報:
1. $2 に 1 つ以上のアポストロフィを含めることができる場合は、ステートメントの前に追加の処理を実行する必要があります$2
(awk 関数を使用)。例えばgsub()
print
gsub(/'\''/,"'"'\\\\''"'",$2);
ほとんど読めない一重引用符、二重引用符、スラッシュ、およびバックスラッシュのため、'
2番目のフィールドのすべてのsがに変換されます。時々引用は本当に痛いです(たとえスクリプトでは一重引用符がある行のように見え'\''
ません)。#!/usr/bin/awk -f
)。
2.またはURLの場合は、単一引用符をアポストロフィのURLエンティティエンコーディング$2
に変更することをお勧めします。%27
シェルは%記号を気にせず、一重引用符内にあるかどうかは確かに気にしませんが、引用符には非常に気にします。
同様に、拡張子を抽出するときにすべての句読点を除外することもできます。例えば
ext=gensub(/.*(\.[^[:punct:]]*)/,"\\1",1);
ただし、URLなどの画像ファイル名が挿入されている場所と方法によってはかなり複雑になる可能性があることに注意してください。
答え3
awkを使用してください:
awk '{split($2, p, "."); system(sprintf("wget -O %s.%s %s\n", $1, p[length(p)], $2))}' images.txt
崩れる
まず、awkを使用して目的のコマンドを大まかに印刷します。
awk '{printf("wget -O %s %s\n", $1, $2)}' images.txt
次に、URLを「.」に分割して拡張子を抽出します。最初のパラメータに追加します。
awk '{split($2, p, "."); printf("wget -O %s.%s %s\n", $1, p[length(p)], $2)}' images.txt
最後に、printfをsprintfに変更し、システムコマンドにラップを入れて、awkにコマンドを実行させます。
awk '{split($2, p, "."); system(sprintf("wget -O %s.%s %s\n", $1, p[length(p)], $2))}' images.txt