Bash 使用(grep?)确定保存哪些文件';还没有下载

Bash 使用(grep?)确定保存哪些文件';还没有下载,bash,scripting,grep,Bash,Scripting,Grep,我的问题总结如下: 我有两个文本文件(download.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.

我的问题总结如下:

我有两个文本文件(download.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

我将如何实现这一目标

我试着这么做,但结果是灾难性的(10m+的“结果”,出于某种原因,我不得不一直按enter键让它运行。此外,只有144k行):

读取url时;执行以下操作
如果!grep“$url”download.txt;那么
echo$url;
fi;
完成>文件到下载.txt

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

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

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

使用
grep
可以从文件名中读取模式(
-f
选项)。在您的情况下,您可以反转匹配(
-v
),前提是
下载的.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

它是否总是像downloaded.txt一样包含list.txt中URL的最后一部分?downloaded.txt仅包含文件名。list.txt包含带有文件名的完整URL。我是否怀疑“您必须一直按enter键才能使其运行”在list.txt中的空行中有其原因,如果grep download.txt,则该空行的结尾为
;然后
从stdin中读取并grepping“download.txt”,您可以添加
test-z“$url”&&continue
在while@Jake你可以只做
grep-vFf download.txt list.txt
如果你想像我提到的那样,你需要
awk
如果你只需要文件名。单独使用
awk
似乎是更好的选择,因为它比
grep
稍微快一点。
% 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