✅ Решения

К оглавлению урока

⚡ Оба скрипта кратко

# copy_by_ext.sh — ключевые части
read -p "Исходная директория: " src
find "$src" -maxdepth 1 -type f -name "*.$ext"
for file in $files; do cp "$file" "$dst"; done

# auto_commit.sh — ключевые части
[ ! -d ".git" ] && exit 1
git add .
git diff-index --quiet HEAD -- && exit 0
git commit -m "Auto $(date +'%Y-%m-%d %H:%M:%S')"

Решение: скрипт 1 — копирование файлов по расширению

Вариант 1 (с подробными проверками)

#!/bin/bash
# Запрос исходной и целевой директории у пользователя
read -p "Введите исходную директорию: " source_directory
read -p "Введите целевую директорию: " target_directory
# Запрос расширения файлов, которые нужно скопировать
read -p "Введите расширение файлов для копирования (без точки): " file_extension

# Проверка существования исходной директории
if [ ! -d "$source_directory" ]; then
  echo "Директория '$source_directory' не существует или недоступна."
  exit 1
fi

# Проверка существования целевой директории
if [ ! -d "$target_directory" ]; then
  echo "Директория '$target_directory' не существует или недоступна."
  exit 1
fi

# Проверка, есть ли файлы с указанным расширением в исходной директории
matching_files=$(find "$source_directory" -maxdepth 1 -type f -name "*.$file_extension")
if [ -z "$matching_files" ]; then
  echo "В директории '$source_directory' нет файлов с расширением '.$file_extension'."
  exit 1
fi

# Копирование файлов с указанным расширением в целевую директорию
for file in $matching_files; do
  cp "$file" "$target_directory"
  echo "Скопирован файл: $file"
done
echo "Готово."

Вариант 2 (альтернативный, без -maxdepth)

#!/bin/bash
echo "Введите расширение файлов, которые вы хотите скопировать (например, txt):"
read file_extension
echo "Введите путь каталога, в который вы хотите скопировать файлы:"
read target_directory

files=$(find . -type f -name "*.$file_extension")
if [ -z "$files" ]; then
  echo "Файлов с расширением .$file_extension не найдено."
else
  echo "Найденные файлы с расширением .$file_extension:"
  echo "$files"
  echo "Копирование файлов в $target_directory..."
  cp $files "$target_directory"
  echo "Копирование завершено."
fi
Отличие вариантов: Вариант 1 использует find -maxdepth 1 (поиск только в указанной директории), Вариант 2 использует find . (рекурсивный поиск от текущей директории). Выбор зависит от задачи.

Решение: скрипт 2 — автоматический коммит

#!/bin/bash
# Этап 1: Проверка текущей директории на наличие репозитория Git
if [ ! -d ".git" ]; then
  echo "Текущая директория не является репозиторием Git."
  exit 1
fi

# Этап 2: Добавление изменений в индекс
git add .

# Этап 3: Проверка наличия изменений для коммита
if git diff-index --quiet HEAD --; then
  echo "Нет изменений для фиксации."
  exit 0
fi

# Этап 4: Фиксация изменений и создание коммита
git commit -m "Автоматический коммит $(date +'%Y-%m-%d %H:%M:%S')"

# Этап 5: Вывод сообщений об успешном выполнении или отсутствии изменений
echo "Изменения успешно зафиксированы и сохранены."
exit 0

Объяснение git diff-index --quiet HEAD --

  • Команда сравнивает индекс (staging area) с HEAD
  • Если изменений нет: возвращает код 0 → в if это "истина" → выводит "Нет изменений" и выходит
  • Если изменения есть: возвращает код 1if ложный → скрипт продолжает и делает git commit

Проверка работы

# Подготовить репозиторий
mkdir test_repo && cd test_repo
git init
echo "test" > file.txt

# Первый запуск (после git add . будут изменения)
chmod +x auto_commit.sh
./auto_commit.sh
# Ожидаемый вывод: Изменения успешно зафиксированы...

# Второй запуск без изменений
./auto_commit.sh
# Ожидаемый вывод: Нет изменений для фиксации.