2010-11-24 3 views
1

Привет,Можно ли оптимизировать эту функцию bash?

У меня есть скрипт 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-файле. HDD_LIST_Array[@] получается для каждого константы выглядит архива:

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

Опять же, это работает, хотя и медленно. Можно ли оптимизировать эту функцию для ускорения работы? Любой совет?

Спасибо.

+0

вы можете дать нам пример вывода unzip -1 для ваших zip-файлов, а выход getCTLfile – 2010-11-24 18:49:42

+0

разархивировать выход === >> CTCA_HDD_20101108_150000.ctl 029045871901 ~ Seagate ~ 20101108 ~ 140021.HDD 028919111311 ~ WD ~ 20101108 ~ 140025.HDD ... – Chris 2010-11-24 19:02:05

+0

getCTLfile выход === >> суффикса: CTL. – Chris 2010-11-24 19:03:14

ответ

3

unzip -l принимает шаблон файла для соответствия после имени входного файла и возвращает 0 при обнаружении его или 11 при сбое.

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

Вы можете использовать cut вместо awk и && вместо if, но это, возможно, незначительно. Я бы предположил, что ваши самые большие настенные часы - это IO на распаковке, да?

Поместите команду time вокруг всего звонка, а также префикс unzip, чтобы получить свои% отличия.

OTHERWISE: Похоже, вы хотите просто найти и распечатать все файлы, которые заканчиваются на *.ctl или что-то в этом линейном окне (head | tail)? Вы можете выбрать только grep или sed с вашего разархивированного вывода? Я уверен, что сценария unzip -l |awk будет достаточным. Я буду обновлять ответ, поскольку вы предоставляете более подробную информацию.

0

Просто небольшой комментарий для дополнения ответа mobrule.

«-» появляется в нежелательных строках. Вам нужно два символа для дифференциации, может быть, ':' или egrep '- [0-9]'

Смежные вопросы