这个bash功能可以优化吗?

时间:2010-11-24 18:46:39

标签: bash function

问候,

我有一个bash脚本可以解析我们从客户端收到的ZIP文件,并在匹配一组标准时解压缩它们。它运作良好,但速度很慢。特别是,以下功能:

function getCTLfile() {
    for i in ${HDD_LIST_Array[@]}
    do
        if [[ `echo ${i}|awk -F . '{print $NF}'` == "ctl" ]]
        then
            echo "${i}"
        fi
    done
}

此功能的目的是获取ZIP文件中包含的控制文件的名称。因此,每个zip文件都获得HDD_LIST_Array[@]

HDD_LIST_Array=(`unzip -l $name | head -n -2|tail -n +4 | sort -r | awk '{print $4}'`)

同样,它虽然缓慢,但仍有效。可以优化此功能以更快地运行吗?有什么建议吗?

感谢。

3 个答案:

答案 0 :(得分:3)

unzip -l在输入文件名后获取匹配的文件模式,在找到它时返回0或在失败时返回11。

entry=$(unzip -l -qq "$name" '*.ctl')
if [ $? -eq 0 ]
then
  awk '{ print $4 }' <<< "$entry"
done

答案 1 :(得分:0)

您可以使用cut代替awk&&代替if,但如果有的话,这可能很小。我会假设你最大的挂钟是解压缩的IO,是吗?

在整个通话中加上time命令以及unzip前缀,以获得%差异。

其他:看起来你想只搜索和打印所有以*.ctl结尾的文件或类似于行窗口(head | tail)的文件?您是否可以从解压缩输出中仅grepsed?我打赌unzip -l |awk脚本就足够了。我会在您提供更多详细信息时更新答案。

答案 2 :(得分:0)

只是补充一下mobrule的回复。

' - '出现在不需要的行中。您需要两个字符来区分,可能是':'或egrep' - [0-9]'