如何从多个tar文件中解压缩特定文件并压缩它们?

时间:2013-08-30 03:19:25

标签: bash zip tar

要求是从多个tars中提取所有* .properties文件并将它们放入zip中。

我试过了:

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

这是在所有tars中创建一个包含.properties文件的zip。

但问题是,每个tar都包含一个包含文件的属性文件夹。上面的命令是创建一个带有单个属性文件夹的zip,其中包含所有文件。

有没有办法将这些文件放在zip中,文件夹结构如{name of the tar} / properties / * .properties?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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`