0

要件は、複数の tar からすべての *.properties ファイルを抽出し、それらを zip に入れることです。

私はこれを試しました:

 find . -iwholename "*/ext*/*.tar.gz"|xargs -n 1 tar --wildcards '*.properties'  -xvzf | zip -@ tar-properties.zip

これは、すべての tar に .properties ファイルを含む zip を作成しています。

ただし、問題は、各 tar にファイルを含むプロパティ フォルダーが含まれているため、tar が構造化されていることです。上記のコマンドは、すべてのファイルを含む単一のプロパティ フォルダーを持つ zip を作成しています。

これらを {name of the tar}/properties/*.properties のようなフォルダー構造で zip に入れる方法はありますか?

4

2 に答える 2

1

おそらくtarオプションでトリックを行うことができます--transform, --xform。このオプションは、式のおかげでパスを操作することを許可しますsed

find . -iwholename "*/ext*/*.tar.gz"|xargs -n 1 tar --wildcards '*.properties'  -xvzf --xform 's#.*/#name_of_the_tar/properties/#' | zip -@ tar-properties.zip
于 2013-08-30T12:52:12.267 に答える
1

このスクリプトを使用できます。私のソリューションも同様に使用--transformします。tarコマンドが でサポートしているかどうかを最初に確認してくださいtar --help 2>&1 | grep -Fe --transform

#!/bin/bash

[ -n "$BASH_VERSION" ] || {
    echo "You need bash to run this script." >&2
    exit 1
}

TEMPDIR=/tmp/properties-files
OUTPUTFILE=$PWD/tar-properties.zip  ## Must be an absolute path.

IFS=

if [[ ! -d $TEMPDIR ]]; then
    mkdir -p "$TEMPDIR" || {
        echo "Unable to create temporary directory $TEMPDIR." >&2
        exit 1
    }
fi

NAMES=()

while read -r FILE; do
    NAMEOFTAR=${FILE##*/}  ## Remove dir part.
    NAMEOFTAR=${NAMEOFTAR%.tar.gz} to remove extension  ## Remove .tar.gz.

    echo "Extracting $FILE."

    tar --wildcards '*.properties' -xvzf "$FILE" -C "$TEMPDIR" --transform "s@.*/@${NAMEOFTAR//@/\\@}/properties/@" || {
        echo "An error occurred extracting to $TEMPDIR." >&2
        exit 1
    }

    NAMES+=("$NAMEOFTAR")
done < <(exec find . -type f -iwholename '*/ext*/*.tar.gz')

(
    cd "$TEMPDIR" >/dev/null || {
        echo "Unable to change directory to $TEMPDIR."
        exit 1
    }

    zip -a "$OUTPUTFILE" "${NAMES[@]}"
)

スクリプトに保存し、それらのファイルを検索するディレクトリで実行します

bash /path/to/script.sh`
于 2013-08-30T15:28:52.690 に答える