Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

Linux / DevOps

Циклы for и while в Bash: массовое переименование и копирование файлов

Обновлено: 27.08.2026 · Официальная документация ↗

Рутинная проблема обработки сотен файлов

Представьте задачу: на сервере скопилось 500 фотографий или лог-файлов, к которым нужно добавить приписку .backup, сменить расширение с .jpeg на .jpg или разложить их по папкам. Вручную выполнять команды для каждого файла невозможно, а установка сторонних скриптов требует времени. Стандартные циклы Bash позволяют решить эту задачу одной строкой прямо в командной строке.

Сравнение циклов:

ЦиклПринцип работыЛучшее применение
forПеребирает заранее известный список элементов или файлов по маскеМассовые операции с файлами (копирование, сжатие, переименование)
whileВыполняется до тех пор, пока истинно заданное условиеПострочное чтение текстовых списков, мониторинг состояния служб

Практические примеры циклов в одну строку

  1. Пример 1. Добавить суффикс .bak ко всем файлам .txt

    for file in *.txt; do cp "$file" "$file.bak"; done

    (Переменная $file по очереди принимает имя каждого текстового документа и копирует его с новым окончанием).

  2. Пример 2. Массовое изменение расширения (.html в .php)

    for f in *.html; do mv "$f" "${f%.html}.php"; done

    (Конструкция ${f%.html} отрезает старое расширение, а .php подставляет новое).

  3. Пример 3. Сжатие всех логов в архивы по отдельности

    for log in /var/log/nginx/*.log; do gzip "$log"; done
  4. Пример 4. Построчное чтение списка сайтов из файла через while

    Создайте файл domains.txt и обработайте каждую строчку:

    while IFS= read -r domain; do
        echo "Проверяем доступность: $domain"
        ping -c 1 "$domain"
    done < domains.txt
💡 Практика специалистов: Никогда не используйте разбор имен файлов через вывод ls (например, for f in $(ls)). Если в имени файла есть пробел или перенос строки, цикл разобьет имя на куски. Всегда используйте прямой масочный шаблон for file in *.расширение.

Частые вопросы (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.

Полезные материалы
Рекомендуем