wgetキャッシングのためにbashの文字列(url)のハッシュを計算する方法
質問
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などに変更します。そのため、連想配列を使用して、ダウンロードされたファイルと実際のファイル名のリストを保存できます。