Проверьте на избыточность перед загрузкой любого файла
Есть ли способ проверить, загрузили ли вы файл ранее или нет, прежде чем загружать его.
Я знаю -
- 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