✅ Решения
⚡ Оба скрипта кратко
# 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это "истина" → выводит "Нет изменений" и выходит - Если изменения есть: возвращает код
1→ifложный → скрипт продолжает и делает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
# Ожидаемый вывод: Нет изменений для фиксации.