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

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

Я знаю -

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

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

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

1
задан 13 April 2017 в 15:37

2 ответа

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

head -c 500 file1.mp3 > fragment1

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

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

2
ответ дан 13 April 2017 в 15:37

На основе ответа Jos вот bash сценарий, который сравнит эти два файла от байта <file_size>-628 к байту <file_size>-129 (последние 500 байтов прежде ID3v1 и ID3v1.1 теги), исключая ID3v1 и ID3v1.1 теги от сравнения. Скопируйте код сценария и вставьте, он в текстовый файл, названный script.sh (или безотносительно) и в Terminal, работает chmod 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
ответ дан 13 April 2017 в 15:37

Другие вопросы по тегам:

Похожие вопросы: