💻 Примеры и скрипты

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

⚡ Скрипты в двух строках

# Скрипт 1: найти и скопировать файлы
matching=$(find "$src" -maxdepth 1 -type f -name "*.$ext")
for f in $matching; do cp "$f" "$dst"; done

# Скрипт 2: авто-коммит если есть изменения
git add . && git diff-index --quiet HEAD -- || git commit -m "Auto $(date)"

Скрипт 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 "Готово."

Пояснение строка за строкой

Конструкция Что делает
read -p "..." var Вывести подсказку и прочитать ввод в переменную
[ ! -d "$dir" ] Истина, если директория НЕ существует
find DIR -maxdepth 1 -type f -name "*.ext" Найти файлы только в DIR (без рекурсии)
[ -z "$matching_files" ] Истина, если переменная пустая (файлы не найдены)
for file in $matching_files Итерация по каждому найденному файлу
cp "$file" "$target_directory" Скопировать файл в целевую директорию

Альтернативное решение (без промежуточной переменной)

#!/bin/bash
echo "Введите расширение файлов:"
read file_extension
echo "Введите путь каталога назначения:"
read target_directory

files=$(find . -type f -name "*.$file_extension")
if [ -z "$files" ]; then
  echo "Файлов с расширением .$file_extension не найдено."
else
  echo "Найденные файлы:"
  echo "$files"
  echo "Копирование в $target_directory..."
  cp $files "$target_directory"
  echo "Копирование завершено."
fi

Скрипт 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

git diff-index --quiet HEAD -- — нестандартная Git-команда для проверки наличия изменений.

  • git diff-index — сравнивает дерево коммита (HEAD) с текущим индексом
  • --quiet — не выводить различия, только код возврата
  • HEAD — сравнивать с последним коммитом
  • -- — разделитель: всё после — это пути (здесь не указаны = все файлы)

Коды возврата:

  • 0 — нет отличий (нет изменений для коммита) → if выполняется
  • 1 — есть отличия (есть что коммитить) → if пропускается
Зачем это нужно: Если попытаться сделать git commit без изменений, Git вернёт ошибку "nothing to commit". Проверка через git diff-index позволяет обработать этот случай корректно в скрипте.

Как использовать скрипт

# Положить скрипт в директорию с Git-репозиторием
chmod +x auto_commit.sh

# Внести изменения в файлы, затем запустить скрипт
./auto_commit.sh
# Вывод: Изменения успешно зафиксированы и сохранены.

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