Циклы for и while в Bash: массовое переименование и копирование файлов
Рутинная проблема обработки сотен файлов
Представьте задачу: на сервере скопилось 500 фотографий или лог-файлов, к которым нужно добавить приписку .backup, сменить расширение с .jpeg на .jpg или разложить их по папкам. Вручную выполнять команды для каждого файла невозможно, а установка сторонних скриптов требует времени. Стандартные циклы Bash позволяют решить эту задачу одной строкой прямо в командной строке.
Сравнение циклов:
| Цикл | Принцип работы | Лучшее применение |
|---|---|---|
| for | Перебирает заранее известный список элементов или файлов по маске | Массовые операции с файлами (копирование, сжатие, переименование) |
| while | Выполняется до тех пор, пока истинно заданное условие | Построчное чтение текстовых списков, мониторинг состояния служб |
Практические примеры циклов в одну строку
Пример 1. Добавить суффикс .bak ко всем файлам .txt
for file in *.txt; do cp "$file" "$file.bak"; done(Переменная
$fileпо очереди принимает имя каждого текстового документа и копирует его с новым окончанием).Пример 2. Массовое изменение расширения (.html в .php)
for f in *.html; do mv "$f" "${f%.html}.php"; done(Конструкция
${f%.html}отрезает старое расширение, а.phpподставляет новое).Пример 3. Сжатие всех логов в архивы по отдельности
for log in /var/log/nginx/*.log; do gzip "$log"; doneПример 4. Построчное чтение списка сайтов из файла через while
Создайте файл
domains.txtи обработайте каждую строчку:while IFS= read -r domain; do echo "Проверяем доступность: $domain" ping -c 1 "$domain" done < domains.txt
Частые вопросы (FAQ)
Зачем брать переменную в кавычки "$file"?
Двойные кавычки защищают от ошибок, если в именах файлов присутствуют пробелы. Без кавычек файл с именем my document.txt будет воспринят Bash как два разных файла.
Как сначала проверить работу цикла, ничего не ломая?
Вместо команд mv или rm поставьте команду echo: for f in *.txt; do echo mv "$f" "$f.bak"; done. Терминал просто напечатает на экране, что он собирался сделать.
Как выполнить цикл по диапазону чисел от 1 до 10?
Используйте конструкцию с фигурными скобками: for i in {1..10}; do mkdir "folder_$i"; done. Будет создано 10 папок от folder_1 до folder_10.
Как прервать бесконечный цикл while?
Нажмите на клавиатуре комбинацию клавиш Ctrl + C для мгновенной отправки сигнала SIGINT.