Bash 如何从大量tar文件中解压特定文件并将其压缩?
需求是从多个tar中提取所有*.properties文件,并将它们放入zip 我试过这个:Bash 如何从大量tar文件中解压特定文件并将其压缩?,bash,zip,tar,Bash,Zip,Tar,需求是从多个tar中提取所有*.properties文件,并将它们放入zip 我试过这个: find . -iwholename "*/ext*/*.tar.gz"|xargs -n 1 tar --wildcards '*.properties' -xvzf | zip -@ tar-properties.zip 这是在所有tar中创建一个包含.properties文件的zip 但问题是tar的结构是,每个tar都包含一个包含文件的properties文件夹。上面的命令使用一个包含所有文
find . -iwholename "*/ext*/*.tar.gz"|xargs -n 1 tar --wildcards '*.properties' -xvzf | zip -@ tar-properties.zip
这是在所有tar中创建一个包含.properties文件的zip
但问题是tar的结构是,每个tar都包含一个包含文件的properties文件夹。上面的命令使用一个包含所有文件的属性文件夹创建一个zip
有没有一种方法可以使用类似{name of the tar}/properties/*.properties这样的文件夹结构将它们放在zip中?您可能可以使用
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
你可以使用这个脚本。我的解决方案也使用了
--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`