Я создал простой сценарий bash в ubuntu для резервного копирования моих проектов:
#!/bin/bash
save_backup_path=~/Downloads/my_backup
web_projects_path=~/Downloads/my_backup/projects
cd $web_projects_path || return
for f in *; do
if [ -d "$f" ]; then
echo "backup project $f";
tar -zcf $save_backup_path/"$f"-$(date +%d-%m-%Y).tar.gz --exclude="$f"/node_modules --exclude="$f"/vendor --exclude="$f"/storage/framework/views/*.php --exclude="$f"/public/uploaded "$f"
fi
done
он создаст tar.gz для каждой папки (имя проекта).
Я хочу создать меню и выбрать, какой проект я хочу создать резервную копию, например: (1, 2, 3 ... или * для всех)
Я не знаю, как обрабатывать выбор и выполнить задание
Я использовал это для хранения всех имен проектов (имен папок)
for f in *; do
if [ -d "$f" ]; then
readarray -t project_names < <(echo "$f")
fi
done
, но при перечислении выбора
echo "Select project for backup:"
select choice in "${project_names[@]}"; do
[[ -n $choice ]] || { echo "Invalid choice. Please try again." >&2; continue; }
break
done
он показывает только последний (имя последней папки).
Как я могу сделать это, чтобы вывести список всех проектов и создать tar.gz для одного выбранного или всех, если выбрано *
*** ОБНОВЛЕНИЕ ****
#!/bin/bash
### backup the projects
save_backup_path=~/Downloads/my_backup
web_projects_path=~/Downloads/my_backup/projects
cd $web_projects_path || return
declare -a project_names
i=1
for d in */
do
project_names[i++]="${d%/}"
done
echo "Select project for backup:"
select choice in "${project_names[@]}"; do
[[ -n $choice ]] || { echo "Invalid choice. Please try again." >&2; continue; }
break
done
echo "backup project $choice ..."
tar -zcf $save_backup_path/"$choice"-$(date +%d-%m-%Y).tar.gz --exclude="$choice"/node_modules --exclude="$choice"/vendor --exclude="$choice"/storage/framework/views/*.php --exclude="$choice"/public/uploaded "$choice"
Я создал выбранный с вариантами выбора, и теперь он работает только для выбранного проекта. Как я могу справиться со всеми проектами? Если пользователь выберет *, чтобы сделать их все (по отдельности)
Я понял, как сделать резервную копию всех проектов. Добавление * к существующему массиву
Вот окончательная версия:
#!/bin/bash
save_backup_path=~/Downloads/my_backup
web_projects_path=~/Downloads/my_backup/projects
cd $web_projects_path || return
declare -a project_names
i=1
for d in */
do
project_names[i++]="${d%/}"
done
project_names[i++]="*"
echo "Select project for backup:"
select choice in "${project_names[@]}"; do
[[ -n $choice ]] || { echo "Invalid choice. Please try again." >&2; continue; }
break
done
backup_project() {
echo "backup project $1 ..."
tar -zcf $save_backup_path/"$1"-$(date +%d-%m-%Y).tar.gz --exclude="$1"/node_modules --exclude="$1"/vendor --exclude="$1"/storage/framework/views/*.php --exclude="$1"/public/uploaded "$1"
}
if [ "$choice" == "*" ]; then
unset project_names[-1]
for project in "${project_names[@]}"; do
backup_project "$project"
done
else
backup_project "$choice"
fi