gpt4 book ai didi

linux - 查找文件是否存在于多个 gzip 压缩包中的最快方法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:28:25 25 4
gpt4 key购买 nike

除了使用 tar tf 并根据我要查找的文件检查每个文件的输出之外,还有更有效的方法吗?

我现在就是这样做的,但是速度很慢(大约有 600-1000 个符合 search_patterns 的存档):

ARRAY=()
ARRAY[0]=/path/to/archives/*search_pattern1*
ARRAY[1]=/path/to/archives/*search_pattern2*
ARRAY[2]=/path/to/archives/*search_pattern3*

for f in ${ARRAY[@]}
do
if [[ $f =~ "matching_pattern1" ]]; then
if tar -tf "$f" | grep "matching_pattern2" ; then
printf "%s\n" $f;
exit 0;
fi
fi
done

值得一提的是,我的 search_patterns 是连续 3 天,我想首先找到与 matching_pattern1 匹配的文件,然后查看所有这些文件以寻找 matching_pattern2 并输出包含它的 tar 文件。

最佳答案

快捷方式不多,tar 文件本质上是连续的,您能做的最好的事情是最多处理每个 tar 文件一次(并且可能在 parallel 中处理多个文件)。使用 GNU tar 搜索 tar 文件时,您可以:

tar --wildcards -tzf file.tgz pattern [pattern...]
parallel -tk --tag tar --wildcards -tzvf ::: file*.tgz ::: "pattern"

使用多个模式,将显示匹配的文件名,如果找到则退出代码 0。请记住为 glob 使用“**”以跨目录匹配。

但是,如果您只是在每个 tar 文件中寻找一个模式,那么这实际上不会比您现有的方法快多少。 GNU tar 对可搜索的 tar 文件进行了优化,但压缩会抵消任何好处。 Tar 文件可以是增量的、拆分的、更新的,甚至包含同一文件的多个副本,没有其他方法可以扫描整个文件(即使大多数 tar 文件没有那么复杂)。

如果这是一项重复性任务,您可以考虑在创建存档时保留一个索引文件:

tar -czvf file.tgz files [...]  > file.idx 

或者,如果您使用 GNU tar,请添加:--index-file=file.idx,一个 -v 仅是文件名,而 -vv 索引文件将包含完整的详细信息,如 -tv 所示。 (此时似乎没有 --index-file0 nul 分隔选项。)

(如果它有用,还有 tar 的替代品,参见 https://serverfault.com/questions/59795/is-there-a-smarter-tar-or-cpio-out-there-for-efficiently-retrieving-a-file-store )

关于linux - 查找文件是否存在于多个 gzip 压缩包中的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26614831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com