2013-08-30 183 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