递归查找不同存档格式的所有存档文件并搜索它们的文件名模式

递归查找不同存档格式的所有存档文件并搜索它们的文件名模式

我最多希望有这样的电话:

$searchtool /path/to/search/ -contained-file-name "*vacation*jpg"

...这样这个工具

  • 对给定路径进行递归扫描
  • 获取所有受支持的存档格式的文件,这些格式至少应该是“最常见的”,例如 zip、rar、7z、tar.bz、tar.gz ...
  • 并扫描存档的文件列表以查找有问题的名称模式(此处*vacation*jpg

我知道如何使用查找工具、tar、解压缩等。我可以将它们与 shell 脚本结合起来,但我正在寻找一种简单的解决方案,可能是 shell 单行或专用工具(欢迎使用 GUI 工具的提示,但我的解决方案必须基于命令行)。

答案1

如果你想要比 AVFS 解决方案更简单的东西,我编写了一个 Python 脚本来完成它,称为方舟查找。你实际上可以这样做

$ arkfind /path/to/search/ -g "*vacation*jpg"

它将递归地执行此操作,因此您可以以任意深度查看档案内的档案。

答案2

(改编自如何递归地 grep 遍历压缩档案?

安装AVFS,一个提供档案内部透明访问的文件系统。首先运行此命令一次以设置计算机文件系统的视图,您可以在其中访问存档,就好像它们是目录一样:

mountavfs

此后,如果/path/to/archive.zip是一个可识别的存档,则~/.avfs/path/to/archive.zip#是一个似乎包含该存档内容的目录。

find ~/.avfs"$PWD" \( -name '*.7z' -o -name '*.zip' -o -name '*.tar.gz' -o -name '*.tgz' \) \
     -exec sh -c '
                  find "$0#" -name "*vacation*.jpg"
                 ' {} 'Test::Version' \;

说明:

  • 挂载 AVFS 文件系统。
  • 在 中查找存档文件~/.avfs$PWD,这是当前目录的 AVFS 视图。
  • 对于每个存档,执行指定的 shell 片段(使用$0= 存档名称和$1= 搜索模式)。
  • $0#是档案的目录视图$0
  • {\}而不是在外部替代内部参数的{}情况下需要(有些这样做,有些不这样做)。find{}-exec ;

或者在 zsh ≥4.3 中:

mountavfs
ls -l ~/.avfs$PWD/**/*.(7z|tgz|tar.gz|zip)(e\''
     reply=($REPLY\#/**/*vacation*.jpg(.N))
'\')

说明:

  • ~/.avfs$PWD/**/*.(7z|tgz|tar.gz|zip)匹配当前目录及其子目录的 AVFS 视图中的档案。
  • PATTERN(e\''CODE'\')将 CODE 应用于 PATTERN 的每个匹配项。匹配文件的名称位于$REPLY.设置reply数组会将匹配项转换为名称列表。
  • $REPLY\#是档案的目录视图。
  • $REPLY\#/**/*vacation*.jpg匹配*vacation*.jpg存档中的文件。
  • N如果没有匹配项,则 glob 限定符会使模式扩展为空列表。

答案3

另一个有效的解决方案是zgrep

zgrep -r filename *.zip

答案4

我的通常解决方案:

find -iname '*.zip' -exec unzip -l {} \; 2>/dev/null | grep '\.zip\|DESIRED_FILE_TO_SEARCH'

例子:

find -iname '*.zip' -exec unzip -l {} \; 2>/dev/null | grep '\.zip\|characterize.txt'

结果如下:

foozip1.zip:
foozip2.zip:
foozip3.zip:
    DESIRED_FILE_TO_SEARCH
foozip4.zip:
...

如果您只想要 zip 文件点击数在上面:

find -iname '*.zip' -exec unzip -l {} \; 2>/dev/null | grep '\.zip\|FILENAME' | grep -B1 'FILENAME'

文件名这里使用了两次,所以可以使用变量。

通过 find 你可能会使用路径/至/搜索

相关内容