我正在尝试将以下用于创建存档的脚本转换为提取它们的脚本。
[[ $# -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开关,允许用户选择解压缩文件的位置。我如何将此添加为用户的选项,因为他们可能想要或不想要更改文件解压缩到的目录。
答案 0 :(得分: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