web-dev-qa-db-ja.com

ファイルをダウンロードする前に冗長性を確認してください

実際にダウンロードする前に、以前にファイルをダウンロードしたことがあるかどうかを確認する方法はありますか。

私は知っています-

  • wget これを実行できるのは、フェッチしようとしているファイルのファイル名が、以前に取得したファイルと同じである場合のみです。
  • 冗長ファイルの検索と削除には チェックサムまたはmd5hash を適用できますが、これはファイルをダウンロードした後でのみ実行できます。

ファイルを完全に再度ダウンロードする前に、ファイルの内容が同じかどうかを確認する方法を提案してください(保存先のファイル名とは関係ありません)。

より正確にmp3ファイルのみをダウンロードすることに興味がありますただし、Jamendo、Soundcloudなど、同じコンテンツ(曲)を持っていてもファイル名が異なるさまざまなソースからのものです。

1
Rishav Ambasta

最初のファイルの最初の500バイトを読み取ります。

head -c 500 file1.mp3 > fragment1

curl -r 0-499 -o fragment2 http://...を使用して、2番目のファイルの最初の500バイトを取得します。次に、diff fragment1 fragment2を実行して、それらが等しいかどうかを確認します。

curlwgetのようなツールで、オプションが増えています。 -rフラグを使用すると、範囲を指定できます。これにより、部分的にダウンロードされます。 wgetにはクォータオプションがありますが、部分的なダウンロードはできません。

2
Jos

Josの回答に基づいて、バイト<file_size>-628からバイト<file_size>-129ID3v1およびID3v1.1タグの前の最新の500バイト)までの2つのファイルを比較するbashスクリプトを次に示します。ただし、比較からID3v1タグとID3v1.1タグは除きます。スクリプトのコードをコピーして、script.sh(またはその他)という名前のテキストファイルに貼り付け、Terminalchmod a+x <script_path>を実行して、実行可能としてマークします。

(注:スクリプトは、curlがファイルサイズを判別できる場合にのみ機能します)

使用法:<script_path> /script.sh <file_path> <url>

#!/bin/bash

size1=$(du -b "$1" | sed 's/\(.*\)\t/\1/' | tr -cd '[[:digit:]]')
size2=$(curl -I "$2" | grep -i 'content-length' | tr -cd '[[:digit:]]')
dd if="$1" of=partial1 bs=1 skip=$(($size1 - 628)) count=500
curl -r $(($size2 - 628))-$(($size2 - 129)) -o partial2 "$2"
cmp partial1 partial2
rm partial1 partial2
1
kos