使用(grep?)确定哪些文件尚未下载

时间:2016-06-06 11:35:19

标签: bash scripting grep

我的问题摘要如下:

我有两个文本文件(downloaded.txt和list.txt)

list.txt包含一个URL列表,例如:

http://example.com/file1.exe
http://example.com/file2.exe
http://example.com/file3.exe
http://example.com/file4.exe
http://example.com/file5.exe

downloaded.txt包含已下载的文件列表:

file1.exe
file2.exe
file3.exe
file5.exe

我想要做的是比较这两个文件,以便我可以看到哪些文件没有被下载(在这个例子中它将是file4.exe

我将如何实现这一目标?

我尝试过这样做,让我们说结果是灾难性的(10米+'结果'由于某种原因,我必须继续按Enter才能让它运行。而且,只有144k行):

while read url; do 
  if ! grep "$url" downloaded.txt; then 
    echo $url; 
fi; 
done < list.txt >> files_to_download.txt

2 个答案:

答案 0 :(得分:1)

使用awk使用网址中的最后一个元素比较两个文件:

$ awk -F/ 'FNR==NR {downloaded[$0]=$0; next} !($NF in downloaded)' downl list 
http://example.com/file4.exe

这将循环文件downloaded.txt并将其值存储在数组downloaded[]中。然后,它遍历文件list.txt并检查数组中是否出现最后/ - 切片。如果没有,则打印该行。

答案 1 :(得分:1)

使用grep,您可以从文件名(-f选项)中读取模式。在您的情况下,您可以撤消匹配(-v),假设downloaded.txt中的文件名未出现在路径中的任何位置:

grep -vFf downloaded.txt list.txt

-F修复字符串匹配。

这会将http://example.com/file4.exe作为输出。获取文件名:

grep -vFf downloaded.txt list.txt | awk -F/ '{ print $NF }'

输出file4.exe

示例:

% cat list.txt 
http://example.com/file1.exe
http://example.com/file2.exe
http://example.com/file3.exe
http://example.com/file4.exe
http://example.com/file5.exe

% cat dl.txt 
file1.exe
file2.exe
file3.exe
file5.exe

% grep -vFf dl.txt list.txt                          
http://example.com/file4.exe

% grep -vFf dl.txt list.txt | awk -F/ '{ print $NF }'
file4.exe