bash搜索ZIP文件中的关键字



我正在寻找一种方法来搜索ZIP文件。我的系统管理员允许我访问一个包含大约150万个zip文件的大容量存储设备。

每个ZIP最多可以包含1000个(ASCII)文件。通常一个文件会有一个名字,里面有一个零件号,像这样:supplier_code~part_number~yyyymmdd~hhmmss.txt

我的老板让我在所有的zip中搜索一个特定的零件号。如果我找到一个与零件号匹配的文件,我需要解压缩那个特定的文件。到目前为止,我已经在几个zip上尝试了这个方法:

find . -name "*zip*"中i

;解压缩$i tmp/;做

问题是它解压缩了所有内容。这是不正确的。我试图像这样指定零件号(阅读unzip手册页)

find . -name "*zip*"中i

;$i -c *part_number* tmp/;做

,但它没有工作(没有找到)。我得到了正确的零件号。

我想做的是可能的吗?

您需要使用unzip-l选项。来自man页面:

-l list归档文件(短格式)。指定文件的名称、未压缩文件大小、修改日期和时间为连同指定的所有文件的总数一起打印。如果UnZip是使用定义的OS2_EAS进行编译时,-l选项还列出存储的OS/2扩展属性(EAs)大小的列和OS/2访问控制列表(acl)。此外,zip文件评论和显示单独的文件注释(如果有的话)。如果文件是从单例文件系统归档的(例如,旧的MS-DOS FAT文件系统),并给出-L选项,文件名是转换为小写,并以插入符号(^)作为前缀。

那么试试这样写-

for i in *.zip; do 
    echo "scanning $i";
    grep -oP "ixia" <(unzip -l "$i") && echo "Found in $i" || echo "Not Found in $i"; 
done

既然您提到您有数百万个zip文件,您可能不需要所有的日志记录。这只是举个例子。

我找到了问题的答案。其实很简单

for i in `find . -name "*zip"`; do unzip -o $i "*partnumber*" -d /tmp/ ; done

例如,下面的代码

for i in `find . -name "*zip"`; do unzip -o $i "*3460*" -d /tmp/ ; done

将实际查看我的设备上的压缩文件,但只解压缩与部件号匹配的文件。

相关内容

最新更新