Bash shell脚本提取存档

问题描述 投票:0回答:1

我正在尝试将以下用于创建存档的脚本转换为提取它们的脚本。

[[ $# -lt 2 ]] && exit 1

name=$1; shift
files=("$@")

#exclude all files/directories that are not readable
for index in "${!files[@]}"; do
   [[ -r ${files[index]} ]] || unset "files[index]"
done

[[ ${#files[@]} -eq 0 ]] && exit 1    

if tar -czvf "${name:-def_$$}.tar.gz" "${files[@]}"; then
   echo "Ok"
else
   echo "Error"
   exit 1
fi

到目前为止我有这个:

[[ $# -lt 1 ]] && exit 1

files=("$@")

#remove files and directories which are not readable
for index in "${!files[@]}"; do
        [[ -r ${files[index]} ]] || unset "files[index]"
done

[[ ${#files[@]} -eq 0 ]] && exit 1

if tar -xzvf "${files[@]}".tar.gz; then
        echo "OK"
else
        echo "Error"
        exit 1
fi

我不知道我是否需要保持这个脚本的转换我不需要丢弃任何参数。我希望能够把它们全部解压缩并解压缩每一个。此外,我看到有一个-C开关,允许用户选择解压缩文件的位置。我如何将此作为用户的选项添加,因为他们可能会或可能不想更改文件解压缩到的目录。

arrays bash shell tar
1个回答
1
投票

你不幸的是不能只做tar -xzvf one.tar.gz two.tar.gz。直截了当的方法是使用一个好的老for循环:

for file in "${files[@]}"; do
   tar -xzvf "$file"
done

或者您可以使用此:

cat "${files[@]}" | tar -xzvf - -i

您可以将第一个参数作为-C选项的指定目录:

[[ $# -lt 2 ]] && exit 1

target=$1; shift
files=("$@")

#remove files and directories which are not readable
for index in "${!files[@]}"; do
   [[ -r ${files[index]} ]] || unset "files[index]"
done

[[ ${#files[@]} -eq 0 ]] && exit 1

mkdir -p -- "$target" || exit 1

for file in "${files[@]}"; do
   tar -xzvf "$file" -C "$target"
done
./script /some/path one.tar.gz two.tar.gz

tar的文件列表也可以这样构造:

target=$1; shift

for file; do
   [[ -r $file ]] && files+=("$file")
done 
© www.soinside.com 2019 - 2024. All rights reserved.