2017-12-21 19 views
0

アーカイブを作成するために使用する以下のスクリプトを、それらを抽出するスクリプトに変換しようとしています。私は任意の引数を廃棄する必要はありません。このスクリプトのようにシフトを維持するために必要かどうか、私は知らないアーカイブを抽出するBashシェルスクリプト

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

files=("[email protected]") 

#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 

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

name=$1; shift 
files=("[email protected]") 

#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 

は、これまでのところ、私はこれを持っています。私はそれらをすべて取って、それぞれを解凍できるようにしたい。また、解凍されたファイルの場所をユーザーが選択できるようにする-Cスイッチがあります。ファイルを解凍するディレクトリを変更したい場合やそうでない場合があるため、これをユーザーのオプションとして追加するにはどうすればよいでしょうか。

答えて

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=("[email protected]") 

#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 
用のファイルの

リストはまた、このように構成することができます: `one.tar.gz`は` two.tar.gz`が含まれている場合は、まあ

target=$1; shift 

for file; do 
    [[ -r $file ]] && files+=("$file") 
done 
+2

、それは '動作します。)' –

+0

@ DavidC.Rankin Haha、良い点があります;) – PesaThe

+0

完了する前にOKエコーを追加し、エコーをエラーするためにelseを実行できますか? – Lenk

関連する問題