簡體   English   中英

Bash Shell腳本提取存檔

[英]Bash shell script to extract archive

我正在嘗試將以下用於創建檔案的腳本轉換為將其解壓縮的腳本。

[[ $# -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開關,它允許用戶選擇解壓縮文件的位置。 我還將如何將此添加為用戶選項,因為他們可能會或可能不想更改文件解壓縮到的目錄。

不幸的是,您不能只執行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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM