我最多希望有这样的电话:
$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 你可能会使用路径/至/搜索