Bash 함수에서 호출할 때 tar 제외 폴더를 무시합니다.

Bash 함수에서 호출할 때 tar 제외 폴더를 무시합니다.

다음 코드는 작동하지 않으며 제외 폴더는 tar에서 무시됩니다. 이 문제를 어떻게 해결할 수 있나요? 제외된 폴더가 여러 개 있고 백업할 폴더가 여러 개 있을 수 있습니다.

date=`date +%Y%m%d`

# tar_create function
# ARG1=<filename_to_write> ARG2=<exclusions> ARG3=<folders>
tar_create () {
    exclude_options=()
    if [ ${#exclude[@]} -ne 0 ]; then
        for x in "${2[@]}"; do
            exclude_options+=(--exclude="$x")
        done
    fi
    echo "$(date '+%Y%m%d:%H:%M:%S'): Running tar czvpf "${1}" "${exclude_options[@]}" ${@:3}"
    tar czvpf "${1}" "${exclude_options[@]}" ${@:3} 2>&1 > "${1}.txt"
    ret=$?
    if [ $ret != 0 ] && [ $ret != 1 ]; then
        echo "$(date '+%Y%m%d:%H:%M:%S'): Error: tar returned $ret for ${1}"
        echo "$(date '+%Y%m%d:%H:%M:%S'): Error: tar returned $ret for ${1}" >> "${1}-errors.txt"
    fi
    echo "$(date '+%Y%m%d:%H:%M:%S'): End tar czvpf "${1}" "${exclude_options[@]}" ${@:3} : return $ret"
}

# do_backup function
# ARG1=<filename_to_write> ARG2=<root folder to backup> ARG3=<exclusions in tar format> ARG4=<folders to backup>
do_backup () {
    if [ ! -d "$(dirname "${1}")" ] || [ ! -w "$(dirname "${1}")" ]; then
        echo "Folder ${1} doesn't exist or isn't writable, can't write backup files" >> backup-error.log
    fi
    if [ ! -d "$(dirname "${2}")" ]; then
        echo "Folder to backup ${1} doesn't exist" >> backup-error.log
    fi

    declare -a exclude=("${!3}")
    declare -a folders=("${!4}")
    declare -a all=("${exclude[@]}" "${folders[@]}")

    echo "cd ${2}"
    cd "${2}"
    echo "tar_create ${1} ${3} ${4}"
    tar_create "${1}" "${3}" "${4}"
}
exclude=( './photos' './videos' './archives' )
folders=( './' )
do_backup "/hdd/backup-$date.tar.gz" "/home/datastorez" "${exclude[@]}" "${folders[@]}"

답변1

이것은 함수를 사용하여 tar 파일을 생성하는 방법에 대한 최소한의 예입니다. 코드에서는 함수에 인수로 전달될 때 제외 폴더와 백업 폴더를 구별할 수 있는 방법이 없습니다. 구문을 사용하여 배열을 여러 단어로 확장합니다 "${name[@]}".

예: exclude배열이 비어 있으면 $3의 매개변수가 do_backup의 첫 번째 요소가 됩니다 folders. 배열에 두 개의 항목이 있는 경우 exclude의 첫 번째 요소 folders는 입니다 $5.

다양성:

  • $1: 백업 이름
  • $2: 전환할 디렉터리
  • $3: 배열 변수의 이름입니다 excludes. 함수에서 배열 요소에 액세스하기 위해 nameref속성( )을 사용하여 -n변수를 선언합니다 .
  • $4- $n: 백업할 디렉터리
# ARG1=<filename_to_write> ARG2=<change_to_dir> ARG3=<name_of_exclude_array> ARG4...=<directories>
tar_create () {
    local -n excl=$3
    local exclude_options=()
    for i in "${excl[@]}"; do
        exclude_options+=( --exclude "$i" )
    done

    tar czvpf "$1" -C "$2" "${exclude_options[@]}" "${@:4}"
}

exclude=( ./photos ./videos ./archives )
dirs=( ./ )
tar_create /hdd/backup-$(date +%Y%m%d).tar.gz /home/datastorez exclude "${dirs[@]}"

관련 정보