Проверьте на избыточность перед загрузкой любого файла

Есть ли способ проверить, загрузили ли вы файл ранее или нет, прежде чем загружать его.

Я знаю -

  • wget может сделать это, только если имя файла, пытающегося получить файл, совпадает с именем файла, уже полученного ранее.
  • Вы можете применить контрольную сумму или md5hash для поиска и удаления избыточных файлов, но это можно сделать только ПОСЛЕ того, как вы скачали файл.

Пожалуйста, предложите способ проверить, является ли файл одинаковым с точки зрения содержания, прежде чем фактически загрузить его ПОЛНОСТЬЮ снова (независимо от имени файла, в который он будет сохранен).

Чтобы быть более точным: я заинтересован в загрузке ТОЛЬКО mp3- файлов, но из разных источников, таких как Jamendo, Soundcloud и т. Д., Которые могут иметь одинаковое содержание (песню), но будут иметь разные имена файлов.

2 ответа

Прочитайте первые 500 байтов первого файла:

head -c 500 file1.mp3 > fragment1

использование curl -r 0-499 -o fragment2 http://... извлечь первые 500 байтов второго файла. Затем сделать diff fragment1 fragment2 чтобы увидеть, равны ли они.

curl это инструмент как wget только с большим количеством опций. -r флаг позволяет указать диапазон, что приведет к частичной загрузке. wget имеет параметр квоты, который, однако, не позволит вам выполнить частичную загрузку.

Основываясь на ответе Джоса, вот bash скрипт, который будет сравнивать два файла из байта <file_size>-628 байт <file_size>-129 (последние 500 байт перед ID3v1 а также ID3v1.1 теги), исключая ID3v1 а также ID3v1.1 теги из сравнения. Скопируйте код скрипта и вставьте его в текстовый файл с именем script.sh (или что угодно) и в Terminal бежать chmod a+x <script_path> пометить его как исполняемый:

(Примечание: скрипт работает, только если curl умеет определять размер файла)

Использование: /script.sh

#!/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
Другие вопросы по тегам