압축/압축 해제할 파일을 선택하기 위한 Bash 스크립트

압축/압축 해제할 파일을 선택하기 위한 Bash 스크립트

Bash 스크립트를 사용하여 파일을 압축 및 압축 해제하려고 하는데 이 기능이 처음이어서 문제가 발생했습니다. 스크립트가 현재 무엇을 하는지 설명하고, 그 다음에 내가 원하는 것이 무엇인지 설명하겠습니다.

  • 사용자가 "압축"을 선택하면 모든 파일을 표시하는 파일 대화 상자가 나타납니다. 사용자가 파일(예 /home/ubuntu/file.txt: )을 선택합니다. 파일이 압축 /home/ubuntu되어 .file.zip/home/ubuntu/file.txt

  • 사용자가 "추출"을 선택하면 모든 파일을 보여주는 파일 대화 상자가 나타납니다. 사용자가 파일을 선택합니다(예 /home/ubuntu/file.zip: 파일
    의 압축이 풀립니다.

이제 스크립트에서 다음을 수행하고 싶습니다.

  1. 파일을 압축한 후 압축된 파일의 디렉터리가 동일해지기를 원합니다. 예 를 /home/ubuntu/filename.txt들어 . or 가 아닌 내부 에만 포함하고 싶습니다 ./home/ubuntu/filename.zipfilename.txt/home/ubuntu/filename.txthome/ubuntu/filename.txt
  2. 압축을 풀 때 파일 대화 상자에 *.zip파일만 표시하여 사용자가 압축되지 않은 파일을 선택할 수 없도록 하고 싶습니다.
  3. 압축을 풀 때 파일이 어디에 저장되어 있는지 알고 싶습니다.

이것은 내 코드입니다.

#! /bin/bash
#This bash compresses and decompresses files
act=-1 #A variable used to transfer which action has been  chosen
action1="Compress"  
action2="Decompress"  #action1 & 2 both used for certain echoes

function menu { #The menu
    clear
    local title="-------Menu-------"
    local prompt="Please choose an action:"
    local options=("$action1" "$action2" "Quit")

    echo "$title"
    PS3="$prompt" #Changes the default '#?' that the select command uses to $prompt.
    select option in "${options[@]}";do

        case $option in

            ${options[0]})
            echo "You chose $option"
            act=0 #Changes act to 0 , to be used later      
            break   
            ;;

            ${options[1]})
            echo "You chose $option"
            act=1 #Changes act to 1 , to be used later              
            break;
            ;;
            ${options[2]}) 
            echo "You chose $option"
            exit
            ;;
            *)
            echo "Invalid option please choose between 1-3"
            ;;
        esac
        break
    done
}

function ynPrompt { #a y/n prompt to go back to the main menu or exit
    while true #helps to loop the y/n prompt in case of wrong input ex. a343
    do  

        read -r -p "Do you want to go back to the menu? [y/N] " response
        case $response in

             [yY][eE][sS]|[yY]) #accepts yes or y and ignores casing ex. yEs is accepted.
             continue 2     #continues the outer control loop
             ;;
             [nN][oO]|[nN])     #accepts no or n and ignores casing ex. nO is accepted.     
             exit           #exits the script   
             ;;
             *)
             continue           #shows the message again
            ;;      
        esac
        break
    done
}

function main { #Performs the selected action
    if [ $act -eq 0 ]; then

        if zip -r ${path}.zip ${path}   
        then echo Compression successful
        echo $? #prints 0 
        else echo $? 
        fi


        #echo "$action1"
        #zip -r ${path}.zip ${path}

    elif [ $act -eq 1 ]; then

        if unzip ${path} 
        then echo Decompression successful
        echo ${path}
        echo $? #prints 0
        else echo $?
        fi

        #echo "$action2"
        #unzip ${path}


    else 
        echo "$error"
    fi

}



#~~~~~~~~~~~~ Script start ~~~~~~~~~~~~~~~~
while true #outer control loop
    do
    menu #call menu
    cd /home
    path=$(zenity --file-selection) #Stores the path of the file into path variable through zenity dialog 
#path can only be .zip if i had --file filter *.zip

    if [ -z $path ]; then  #checks length of $path , returns true if length = 0 
        ynPrompt #call ynprompt
    else
        main     #call main
    fi

    break
done

답변1

압축에 사용할 수 있습니다.

compress_file () 
{
    local dir file
    test -f "$1" || return 2
    dir="$(readlink -f "$1")"
    file="${dir##*/}"
    dir="${dir%/*}"
    cd "$dir"
    # check whether target file exists:
    # test -f "$file".zip && : whatever
    echo zip "$file".zip "$file"
}

compress_file /path/to/file

압축이 풀린 파일을 선택하세요

나는 익숙하지 않다 zenity. 파일을 필터링할 수 없는 것 같습니다. 임시 디렉터리를 만들고 *.zip여기에 파일을 연결한 다음 해당 디렉터리에 대해 실행하면 zenity원하는 효과를 얻을 수 있습니다. 물론 사용자가 다른 디렉토리를 선택하면 모든 파일이 표시됩니다.

zipfile_dialog () 
{
    local file startdir="/home/ubuntu" tmpdirname=.zipscript.$$
    cd "$startdir" || return 2
    test -d "$tmpdirname" && { rm -r "$tmpdirname" || return 2; }
    mkdir -p "$tmpdirname" || return 2
    for file in *.zip; do
        cd "$tmpdirname"
        ln -s ../"$file"
        cd ..
    done
    ls "$tmpdirname"
    # call zenity here
    rm -r "$tmpdirname"
}

zipfile_dialog

또 다른 방법은 파일 선택에 셸을 사용하는 것입니다. 옵션( complete, compgen)이 있는 경우 프로그래밍 가능한 완성을 통해 이 작업을 수행할 수 있습니다.

관련 정보