wgetキャッシングのためにbashの文字列(url)のハッシュを計算する方法

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

  •  05-07-2019
  •  | 
  •  

質問

wgetを使用してファイルをダウンロードし、さまざまなファイルからURLを読み取る小さなツールを作成しています。同じURLが異なるファイルに存在する場合があります。 URLは1つのファイルに複数回存在することさえあります。ページを数回ダウンロードするのは効率的ではありません(そのURLがリストで見つかるたびに)。

したがって、単純なアプローチは、ダウンロードしたファイルを保存し、wgetに既にダウンロードされている場合は再度ダウンロードしないように指示することです。

これは非常に簡単です。ただし、URLは非常に長い(多くのGETパラメーター)ため、ファイル名として使用できません(wgetはエラー「書き込みできない... []ファイル名が長すぎます」を返します)。

したがって、ダウンロードしたファイルの名前を変更する必要があります。ただし、キャッシングメカニズムが機能するには、名前変更スキームで<!> quot; one url <!> lt; = <!> gt;を実装する必要があります。 one name <!> quot ;:与えられたURLが複数の名前を持つことができる場合、キャッシュは機能しません(つまり、ファイルが見つかった順に番号を付けると、wgetにどのURLが既に存在しているかを識別させませんダウンロード済み)。

最も簡単な名前変更スキームは、ファイル名のmd5ハッシュを計算することです( (およびファイル自体のではない、これはmd5sumが行うことです)。これにより、ファイル名が一意になり、特定のURLが常に同じ名前になります。

Perlなどでこれを行うことは可能ですが、bashで直接行うことも、システムユーティリティ(RedHat)を使用して行うこともできますか?

役に立ちましたか?

解決

md5sumシステムユーティリティが必要なようです。

URLMD5=`/bin/echo $URL | /usr/bin/md5sum | /bin/cut -f1 -d" "`

ファイル名のハッシュのみを作成する場合は、sedを使用してすばやく取得できます。

FILENAME=`echo $URL | /bin/sed -e 's#.*/##'`
URLMD5=`/bin/echo $FILENAME | /usr/bin/md5sum | /bin/cut -f1 -d" "`

ディストリビューションによっては、cutへのパスが/usr/bin/cutになる場合があります。

他のヒント

回答にコメントする担当者はいませんが、Epsilon Primeの回答には明確な説明があります。デフォルトでは、echoはテキストの最後に改行を出力します。 md5の合計を、他のツール(php、Javaのmd5など)によって生成されるものと一致させる場合は、呼び出す必要があります

echo -n "$url"

改行を抑制します。

Ubuntu(Precise)ボックスの他のオプション:

  • echo -n $STRING | sha512sum
  • echo -n $STRING | sha256sum
  • echo -n $STRING | sha224sum
  • echo -n $STRING | sha384sum
  • echo -n $STRING | sha1sum
  • echo -n $STRING | shasum

Macのその他のオプション:

  • echo -n $STRING | shasum -a 512
  • echo -n $STRING | shasum -a 256
  • など

Bash の新しいバージョンは、連想配列とインデックス付き配列を提供します。 。このような何かがあなたのために働くかもしれません:

declare -A myarray
myarray["url1"]="url1_content"
myarray["url2"]=""

if [ ! -z ${myarray["url1"]} ] ; then 
    echo "Cached";
fi

wgetは通常、ファイル名をfilename.html.1、.2などに変更します。そのため、連想配列を使用して、ダウンロードされたファイルと実際のファイル名のリストを保存できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top