我正在寻找一种方法来搜索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
将实际查看我的设备上的压缩文件,但只解压缩与部件号匹配的文件。