有没有一种方法可以优化此代码并使其更快或更其他解决方案?

时间:2019-06-06 09:49:04

标签: bash

我希望从我的项目.jar文件中收集yang模型。尽管我提出了一种方法,但是这需要时间,而我的同事们并不高兴。

#!/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 :(得分:0)

如果在脚本调用之间.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

有关我上面所做的其他一些更改,请参见Correct Bash and shell script variable capitalizationhttp://mywiki.wooledge.org/BashFAQ/082https://mywiki.wooledge.org/QuotesHow can I store the "find" command results as an array in Bash

我认为您有一些原因可以循环播放.yang文件,如果已经存在相同名称的文件,则不要移动它们,而不是将.jar文件解压缩到最终输出目录中。