
次のコードは機能しません。除外フォルダは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
。配列に2つの項目がある場合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[@]}"