как создать меню bash для перечисленных папок

Я создал простой сценарий 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"

Я создал выбранный с вариантами выбора, и теперь он работает только для выбранного проекта. Как я могу справиться со всеми проектами? Если пользователь выберет *, чтобы сделать их все (по отдельности)

2
задан 17 April 2021 в 12:42

1 ответ

Я понял, как сделать резервную копию всех проектов. Добавление * к существующему массиву

Вот окончательная версия:

#!/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
0
ответ дан 23 April 2021 в 23:21

Другие вопросы по тегам:

Похожие вопросы: