有没有办法可以在实际下载文件之前检查是否已经下载过它?
我知道-
- 获得仅当尝试获取的文件的文件名与之前已检索到的文件的文件名相同时才能这样做。
- 您可以申请校验和或 md5hash用于查找和删除冗余文件,但这只能在下载文件后才能完成。
请建议一种方法来检查文件内容是否相同,然后再真正完全下载它(与其要保存的文件名无关)。
为了更加精确:我只对下载感兴趣mp3文件,但来自不同的来源,如 Jamendo、Soundcloud 等,它们可能具有相同的内容(歌曲),但文件名不同。
答案1
读取第一个文件的前500个字节:
head -c 500 file1.mp3 > fragment1
使用curl -r 0-499 -o fragment2 http://...
检索第二个文件的前 500 个字节。然后,执行diff fragment1 fragment2
以查看它们是否相等。
curl
是一个类似工具,wget
但选项更多。该-r
标志允许您指定一个范围,这将导致部分下载。wget
有一个配额选项,但是不允许您进行部分下载。
答案2
根据 Jos 的回答,下面是一个脚本,它将逐字节bash
比较两个文件(和标签之前的最新 500 个字节),并从比较中排除和标签。复制脚本的代码并将其粘贴到名为(或任何其他名称)的文本文件中,然后运行以将其标记为可执行文件:<file_size>-628
<file_size>-129
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