wget 캐싱을위한 bash에서 문자열 (URL)의 해시를 계산하는 방법

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

  •  05-07-2019
  •  | 
  •  

문제

wget을 사용하여 파일을 다운로드하고 다른 파일의 URL을 읽는 작은 도구를 작성합니다. 동일한 URL이 다른 파일에 존재할 수 있습니다. URL은 한 파일로 여러 번 존재할 수도 있습니다. 페이지를 여러 번 다운로드하는 것은 비효율적입니다 (목록에서 URL이 발견 될 때마다).

따라서 간단한 접근 방식은 다운로드 된 파일을 저장하고 WGET에 이미있는 경우 다시 다운로드하지 말라고 지시하는 것입니다.

그것은 매우 간단 할 것입니다. 그러나 URL은 매우 길다 (많은 사람들이 매개 변수를 얻는다) 따라서 파일 이름에 사용할 수 없다 (WGET는 '파일 이름이 너무 길다')에 오류가 쓸 수 없음).

따라서 다운로드 된 파일의 이름을 바꿔야합니다. 그러나 캐싱 메커니즘이 작동하려면 이름 변경 체계는 "One URL <=> 하나의 이름"을 구현해야합니다. 주어진 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는 텍스트 끝에 Newline을 인쇄합니다. MD5 합계가 다른 도구 (예 : PHP, Java의 MD5 등)가 생성 할 내용과 일치하려면 전화해야합니다.

echo -n "$url"

Newline을 억제 할 것입니다.

내 우분투 (정확한) 상자의 다른 옵션 :

  • 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
  • 등.

최신 버전 세게 때리다 인덱스 배열뿐만 아니라 연관 배열을 제공하십시오. 이와 같은 것이 당신에게 효과가있을 수 있습니다.

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