Есть ли способ оптимизировать этот код и сделать его быстрее или какое-либо другое лучшее решение? - PullRequest
0 голосов
/ 06 июня 2019

Я собираюсь собрать модели Янга из файлов моего проекта .jar. Хотя я пришел с подходом, но на это уходит время, и мои коллеги недовольны.

#!/bin/sh

set -e

# FIXME: make this tuneable
OUTPUT="yang models"
INPUT="."

JARS=`find $INPUT/system/org/linters -type f -name '*.jar' | sort -u`

# FIXME: also wipe output?
[ -d "$OUTPUT" ] || mkdir "$OUTPUT"
for jar in $JARS; do
    artifact=`basename $jar | sed 's/.jar$//'`
    echo "Extracting modules from $artifact"
    # FIXME: better control over unzip errors
    unzip -q "$jar" 'META-INF/yang/*' -d "$artifact" \
        2>/dev/null || true

    dir="$artifact/META-INF/yang"
    if [ -d "$dir" ]; then
        for file in `find $dir -type f -name '*.yang'`; do
            module=`basename "$file"`
            echo -e "\t$module"
            # FIXME: better duplicate detection
            mv -n "$file" "$OUTPUT"
        done
    fi

    rm -rf "$artifact"
done

1 Ответ

0 голосов
/ 06 июня 2019

Если файлы .jar не меняются между вызовами вашего сценария, вы можете значительно ускорить выполнение сценария, кэшируя файлы .jar и работая только с теми, которые изменились, например:

#!/bin/env bash
set -e

# FIXME: make this tuneable
output='yang models'
input='.'
cache='/some/where'
mkdir -p "$cache" || exit 1

readarray -d '' jars < <(find "$input/system/org/linters" -type f -name '*.jar' -print0 | sort -zu)

# FIXME: also wipe output?
mkdir -p "$output" || exit 1
for jarpath in "${jars[@]}"; do

    diff -q "$jarpath" "$cache" || continue
    cp "$jarpath" "$cache"

    jarfile="${jarpath##*/}"
    artifact="${jarfile%.*}"
    printf 'Extracting modules from %s\n' "$artifact"
    # FIXME: better control over unzip errors
    unzip -q "$jarpath" 'META-INF/yang/*' -d "$artifact" 2>/dev/null

    dir="$artifact/META-INF/yang"
    if [ -d "$dir" ]; then
        readarray -d '' yangs < <(find "$dir" -type f -name '*.yang' -print0)
        for yangpath in "${yangs[@]}"; do
            yangfile="${yangpath##*/}"
            printf '\t%s\n' "$yangfile"
            # FIXME: better duplicate detection
            mv -n "$yangpath" "$output"
        done
    fi

    rm -rf "$artifact"
done

См. Правильное использование заглавных букв в сценариях Bash и shell , http://mywiki.wooledge.org/BashFAQ/082, https://mywiki.wooledge.org/Quotes, Как сохранить результаты команды "find" в виде массива в Bash для некоторых других изменений, которые я сделал выше.

Я предполагаю, что у вас есть причина зацикливаться на файлах .yang и не перемещать их, если файл с таким именем уже существует, вместо того, чтобы разархивировать файл .jar вконечный выходной каталог.

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