22

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

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

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

そのため、ダウンロードしたファイルの名前を変更する必要があります。しかし、キャッシング メカニズムを機能させるには、名前変更スキームで「1 つの URL <=> 1 つの名前」を実装する必要があります。特定の URL に複数の名前を付けることができる場合、キャッシングは機能しません (つまり、単純にファイルに順番に番号を付ける場合)。それらが見つかった場合、どの URL が既にダウンロードされているかを wget に識別させません)。

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

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

4

4 に答える 4

37

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.

于 2009-10-21T17:41:17.597 に答える
12

私の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
于 2015-06-05T21:46:45.163 に答える
11

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

echo -n "$url"

改行を抑制します。

于 2011-11-19T14:42:29.643 に答える
1

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

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

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

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

于 2009-10-21T17:58:38.603 に答える