无法从特定路径和列表中找到所有不匹配的文件

时间:2018-10-22 14:33:07

标签: bash shell

我有以下情况,

在此路径中,我有以下文件:

ENTRY/ORDERNUMBER_20181016000057.XML
ENTRY/ORDERNUMBER_20181016000058.XML
ENTRY/ORDERNUMBER_20181016000059.XML
ENTRY/ORDERNUMBER_20181016000157.XML
ENTRY/ORDERNUMBER_20181016000158.XML
ENTRY/ORDERNUMBER_20181016000159.XML
ENTRY/ORDERNUMBER_20181016000257.XML
ENTRY/ORDERNUMBER_20181016000258.XML
ENTRY/ORDERNUMBER_20181016000259.XML

另一方面,我将以下文件名放入列表中(实际上是txt文件):

ENTRY/ORDERNUMBER_20181016000057.XML
ENTRY/ORDERNUMBER_20181016000058.XML
ENTRY/ORDERNUMBER_20181016000059.XML
ENTRY/ORDERNUMBER_20181016000157.XML
ENTRY/ORDERNUMBER_20181016000158.XML
ENTRY/ORDERNUMBER_20181016000159.XML

因此,我们的想法是仅获取不匹配的文件。即:

ENTRY/ORDERNUMBER_20181016000257.XML
ENTRY/ORDERNUMBER_20181016000258.XML
ENTRY/ORDERNUMBER_20181016000259.XML

我尝试使用:

find ENTRY -name "ORDERNUMBER*" | grep -v "ORDERNUMBER*" Exclude.txt

但是我没有任何文件。

您知道我在做什么错吗?

最诚挚的问候!

6 个答案:

答案 0 :(得分:2)

什么

grep -v "ORDERNUMBER*" Exclude.txt

是从Exclude.txt打印与正则表达式ORDERNUMBER*不匹配的所有行。不会读取通过管道来自查找的标准输入。 文件中的所有行均包含字符串ORDERNUMBER,该字符串与模式匹配,因此结果为空。

要将文件视为模式列表,并将stdin用作要匹配的文件,请使用

find ENTRY -name "ORDERNUMBER" 2>>/dev/null | grep -f Exclude.txt -v

@frank建议。或尝试diff:

find ENTRY -name "ORDERNUMBER" 2>>/dev/null | diff Exclude.txt -

答案 1 :(得分:1)

如果您在1.txt中有第一个文件列表,而在exclude.txt中有第二个列表,则可以使用join命令:

join -v 1 1.txt exclude.txt

现在,我们可以使用流程替换将命令的结果直接传递给join了-即<()-给我们:

join -v 1 <(find ENTRY -name "ORDERNUMBER*") exclude.txt

答案 2 :(得分:1)

尝试一下

find _dir_ -type f -exec /bin/bash -c '[[ $(grep -c '{}' filelist.txt) -eq 0 ]] && echo '{} \;

其中 dir 是包含文件的任何目录。

查找将遍历 dir 目录中的所有内容,并处理找到的每个文件。查找中的执行程序运行一个内联bash脚本,该脚本会在filelist.txt中查找查找当前正在处理的文件的名称。如果该文件不在您的filelist.txt文件中,则会将其打印出来。

希望这会有所帮助。

答案 3 :(得分:-1)

尝试

find ENTRY -name "ORDERNUMBER" 2>>/dev/null | grep -f Exclude.txt -v

答案 4 :(得分:-1)

您可以尝试使用awk:

find ENTRY -name "ORDERNUMBER*" | awk 'NR==FNR{a[$0];next}!($0 in a)' exclude.txt -

答案 5 :(得分:-1)

如果您在ENTRY目录的父目录中,则此Perl一线解决方案可以使用。

> ls -1 ENTRY/*
ENTRY/ORDERNUMBER_20181016000057.XML
ENTRY/ORDERNUMBER_20181016000058.XML
ENTRY/ORDERNUMBER_20181016000059.XML
ENTRY/ORDERNUMBER_20181016000157.XML
ENTRY/ORDERNUMBER_20181016000158.XML
ENTRY/ORDERNUMBER_20181016000159.XML
ENTRY/ORDERNUMBER_20181016000257.XML
ENTRY/ORDERNUMBER_20181016000258.XML
ENTRY/ORDERNUMBER_20181016000259.XML
> cat entry.txt
ENTRY/ORDERNUMBER_20181016000057.XML
ENTRY/ORDERNUMBER_20181016000058.XML
ENTRY/ORDERNUMBER_20181016000059.XML
ENTRY/ORDERNUMBER_20181016000157.XML
ENTRY/ORDERNUMBER_20181016000158.XML
ENTRY/ORDERNUMBER_20181016000159.XML
> perl -ne 'BEGIN {@f1=qx(ls ENTRY/*);@f2=qx(cat entry.txt);@diff{@f1}=undef;delete @diff{@f2};foreach( keys %diff){print}exit}' 
ENTRY/ORDERNUMBER_20181016000258.XML
ENTRY/ORDERNUMBER_20181016000259.XML
ENTRY/ORDERNUMBER_20181016000257.XML
>