DEV Community

cdworkcd
cdworkcd

Posted on

unpack tar doesn't work for me in the script but it does in Terminal

If possible I have a question:
this what I did in the Terminal:

$ tar cvf compress.tar jenkinsfile
jenkinsfile
$ ls
compress.tar  jenkinsfile
$ rm jenkinsfile
$ ls
compress.tar
$ tar --overwrite -xvf compress.tar
jenkinsfile
$ ls
compress.tar  jenkinsfile
$
Enter fullscreen mode Exit fullscreen mode

It works fine- the file jenkinsfile unpacked. and this is my script: ("$1" = compress.tar in this case)

...
function func_decompress(){
    check=0
    case $1 in
    *.tar.gz | *.tar | *.tar.bz2)
        check=1
        tar --overwrite -xvf "$1" 
        rm "$1" ;;
    *.zip)
        check=1
        unzip -o "$1"
        rm "$1" ;;
    *.bz2)
        check=1
        bunzip2 "$1" ;;
    *.gz)
        check=1
        gunzip "$1" ;;
    esac
    if [ $check == 0 ]
    then
        uncompressPrintFunc "$1"
    else
        compressPrintFunc "$1"
    fi
}
...
Enter fullscreen mode Exit fullscreen mode
$ ./bcd.sh -v -r bcd
Ignoring 3077ed8635670985d31fdbf043bd3d60.jpg ...
jenkinsfile
Unpacking compress.tar ...
Ignoring jenkinsfile ...
Ignoring file.txt ...
Ignoring file1.txt ...
Ignoring file2.txt ...
Decompressed 1
(failure for 5 files)
Enter fullscreen mode Exit fullscreen mode

this is the Terminal:

$ ls
compress.tar  jenkinsfile
$ rm jenkinsfile
$ ls
compress.tar
$ cd ../..
bcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcd$ ./bcd.sh -v -r bcd
Ignoring 3077ed8635670985d31fdbf043bd3d60.jpg ...
jenkinsfile
Unpacking compress.tar ...
Ignoring file.txt ...
Ignoring file1.txt ...
Ignoring file2.txt ...
Decompressed 1
(failure for 4 files)
bcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcdbcd$ cd bcd/bcdbcdbcd/
$ ls
$
Enter fullscreen mode Exit fullscreen mode

ps This is all my script:

#! /usr/bin/bash

array=($@)
new_array=()
for value in "${array[@]}"
do
    [[ $value != '-r' && $value != '-v' ]] && new_array+=($value)
done
array=("${new_array[@]}")
unset new_array

count_compress_files=0
count_uncompress_files=0
option_r=false
option_v=false

while getopts "rv" opt; do
    case $opt in
        r)  
            option_r=true
            ;;  
        v)  
            option_v=true
            ;;  
    esac
done

function func_recursive() 
{
            array=()
            while IFS=  read -r -d $'\0'; do
                array+=("$REPLY")
            done < <(find $1 -type f -follow -print0)
            for i in "${array[@]}"
            do
                func_decompress "$i"
            done   
}

function func_decompress(){
    check=0
    case $1 in
    *.tar.gz | *.tar | *.tar.bz2)
        check=1
        tar -c -xvf "$1" 
        rm "$1" ;;
    *.zip)
        check=1
        unzip -o "$1"
        rm "$1" ;;
    *.bz2)
        check=1
        bunzip2 "$1" ;;
    *.gz)
        check=1
        gunzip "$1" ;;
    esac
    if [ $check == 0 ]
    then
        uncompressPrintFunc "$1"
    else
        compressPrintFunc "$1"
    fi
}

function uncompressPrintFunc(){
    if [ $option_v == true ]
        then
            file=$(extraction_func "$1")
            echo "Ignoring $file ..."
        fi
    count_uncompress_files=$(( count_uncompress_files+1 ))
}

function compressPrintFunc(){
    if [ $option_v == true ]
        then
            file=$(extraction_func "$1")
            echo "Unpacking $file ..."
        fi
    count_compress_files=$(( count_compress_files+1 ))
}

function extraction_func(){
    filepath="$1"
    FILE=${filepath##*/}
    echo "$FILE"
}

function func_not_recursive_folder(){
    echo "I am not_recursive_folder"
    echo "check 1: $1"
    i=0
    filepath
    while read line
    do
        filepath=$(realpath -s "$line")
        array[ $i ]="$filepath"        
        (( i++ ))
    done < <(ls $1)
    for packedfile in "${array[@]}"
    do
        func_decompress "$packedfile"
    done

}

for i in "${array[@]}"
do
    bcd=$(find ~+ -name "$i")
    if [[ -d $bcd ]]
    then
        if [ $option_r == true ]
        then
            func_recursive $bcd
        else
            func_not_recursive_folder $bcd
        fi
    elif [[ -f $bcd ]]
    then
        func_decompress $bcd
    else
        echo "This input: $i is not valid!"
        exit 1
    fi
done

echo "Decompressed $count_compress_files"
[[ "$count_uncompress_files" -gt 0 ]] && echo "(failure for $count_uncompress_files files)" || echo "(success)"
Enter fullscreen mode Exit fullscreen mode

I would appreciate it if someone could help me! Thanks

Top comments (1)

Collapse
 
moopet profile image
Ben Sinclair

In your full script you have tar -c -xvf "$1" which is different to your working version, which is tar --overwrite -xvf "$1". The c will be trying to create an archive, and it'll conflict with the x.

I'm not sure whether there's anything else wrong with it, but it looks like you've copied something wrong there.