Можно ли оптимизировать эту функцию bash? - PullRequest
1 голос
/ 24 ноября 2010

Привет,

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

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

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

Спасибо.

Ответы [ 3 ]

3 голосов
/ 24 ноября 2010

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

entry=$(unzip -l -qq "$name" '*.ctl')
if [ $? -eq 0 ]
then
  awk '{ print $4 }' <<< "$entry"
done
0 голосов
/ 27 ноября 2010

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

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

0 голосов
/ 24 ноября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...