在递归的压缩文件目录中查找文件

8
我有一个包含zip文件的完整目录结构。我想要:
  1. 递归遍历整个目录结构,获取所有zip文件
  2. 在这些zip文件中找到一个名为“*myLostFile.ext”的特定文件。
我尝试过的方法
1. 我知道可以很容易地递归列出文件:
find myLostfile -type f

2. 我知道我可以在zip存档文件内列出文件:

unzip -ls myfilename.zip

如何在zip文件的目录结构中查找特定文件?
3个回答

11

您可以使用for循环方法在单层级(或在bash 4中使用globstar进行递归)搜索.zip文件时省略使用find

for i in *.zip; do grep -iq "mylostfile" < <( unzip -l $i ) && echo $i; done

用于 Bash 4 中的递归搜索:

shopt -s globstar
for i in **/*.zip; do grep -iq "mylostfile" < <( unzip -l $i ) && echo $i; done

8

您可以使用xargs来处理find命令的输出,也可以像下面这样进行:

find . -type f -name '*zip' -exec sh -c 'unzip -l "{}" | grep -q myLostfile' \; -print

该命令将在 . 目录中搜索与 *zip相匹配的文件,然后对每个文件运行 unzip -ls 并搜索您的文件名。 如果找到该文件名,则会打印匹配它的 zip 文件的名称。


1
注意:在Linux上没有unzip选项。否则,该命令可以正常工作。 - David C. Rankin
用法:unzip [-Z] [-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir] 默认操作是将列表中的文件解压缩到exdir,除了xlist中的文件; file[.zip]可以是通配符。-Z => ZipInfo模式(“unzip -Z”用于使用)。 - Alex Gordon
正如David所指出的那样,我的解压命令中不应该有s,我正在编辑以删除它。 - Eric Renouf

0
一些人建议使用ugrep来搜索zip文件和tarballs。要查找包含mylostfile文件的zip文件,请将其指定为-g glob模式,如下所示:
ugrep -z -l -g'myLostfile' ''

使用空的正则表达式模式'',可以递归地搜索工作目录下的所有文件,包括任何zip、tar、cpio/pax档案中的mylostfile。如果您只想搜索位于工作目录中的zip文件:

ugrep -z -l -g'myLostfile' '' *.zip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接