2013-08-30 64 views
0

要求是从多个焦点提取所有* .properties文件并将它们放入一个zip文件中。如何从许多tar文件解压缩特定文件并将其压缩?

我尝试这样做:

find . -iwholename "*/ext*/*.tar.gz"|xargs -n 1 tar --wildcards '*.properties' -xvzf | zip [email protected] tar-properties.zip 

这在所有的焦油创建与.properties文件有拉链。

但问题是,焦油结构如每个焦油包含一个属性文件夹,其中包含的文件。上述命令创建一个包含所有文件的单个属性文件夹的zip文件。

是否有一种方法可以将这些文件放入zip文件夹中,如{tar名称}/properties/*。properties的文件夹结构?

回答

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 "[email protected]*/@${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` 
要搜索的目录中运行它
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 [email protected] tar-properties.zip