Linux циклы по файлам

Глава 10. Циклы и ветвления

Управление ходом исполнения — один из ключевых моментов структурной организации сценариев на языке командной оболочки. Циклы и преходы являются теми инструментальными средствами, которые обеспечивают управление порядком исполнения команд.

10.1. Циклы

Цикл — это блок команд, который исполняется многократно до тех пор, пока не будет выполнено условие выхода из цикла.

циклы for

Это одна из основных разновидностей циклов. И она значительно отличается от аналога в языке C.

На каждом проходе цикла, переменная-аргумент цикла arg последовательно, одно за другим, принимает значения из списка list.

Элементы списка могут включать в себя шаблонные символы.

Есл ключевое слово do находится в одной строке со словом for, то после списка аргументов (перед do) необходимо ставить точку с запятой.

Пример 10-1. Простой цикл for

Каждый из элементов [списка] может содержать несколько аргументов. Это бывает полезным при обработке групп параметров. В этом случае, для принудительного разбора каждого из аргументов в списке, необходимо использовать инструкцию set (см. Пример 11-13).

Пример 10-2. Цикл for с двумя параметрами в каждом из элементов списка

В качестве списка, в цикле for, можно использовать переменную.

Пример 10-3. Fileinfo: обработка списка файлов, находящегося в переменной

В [списке] цикла for могут быть использованы имена файлов, которые в свою очередь могут содержать символы-шаблоны.

Пример 10-4. Обработка списка файлов в цикле for

Если [список] в цикле for не задан, то в качестве оного используется переменная $@ — список аргументов командной строки. Оень остроумно эта особенность проиллюстрирована в Пример A-18.

Пример 10-5. Цикл for без списка аргументов

При создании списка аргументов, в цикле for допускается пользоваться подстановкой команд. См. Пример 12-39, Пример 10-10 и Пример 12-33.

Пример 10-6. Создание списка аргументов в цикле for с помощью операции подстановки команд

Более сложный пример использования подстановки команд при создании списка аргументов цикла.

Пример 10-7. grep для бинарных файлов

Еще один пример.

Пример 10-8. Список всех пользователей системы

И заключительный пример использования подстановки команд при создании [списка].

Пример 10-9. Проверка авторства всех бинарных файлов в текущем каталоге

Результат работы цикла for может передаваться другим командам по конвейеру.

Пример 10-10. Список символических ссылок в каталоге

Вывод цикла может быть перенаправлен со stdout в файл, ниже приводится немного модифицированный вариант предыдущего примера, демонстрирующий эту возможность.

Пример 10-11. Список символических ссылок в каталоге, сохраняемый в файле

Оператор цикла for имеет и альтернативный синтаксис записи — очень похожий на синтаксис оператора for в языке C. Для этого используются двойные круглые скобки.

Пример 10-12. C-подобный синтаксис оператора цикла for

А сейчас пример сценария, который может найти «реальное» применение.

Пример 10-13. Работа с командой efax в пакетном режиме

Оператор while проверяет условие перед началом каждой итерации и если условие истинно (если код возврата равен 0 ), то управление передается в тело цикла. В отличие от циклов for, циклы while используются в тех случаях, когда количество итераций заранее не известно.

Как и в случае с циклами for/in , при размещении ключевого слова do в одной строке с объявлением цикла, необходимо вставлять символ «;» перед do.

Обратите внимание: в отдельных случаях, таких как использование конструкции getopts совместно с оператором while, синтаксис несколько отличается от приводимого здесь.

Пример 10-14. Простой цикл while

Пример 10-15. Другой пример цикла while

Оператор while может иметь несколько условий. Но только последнее из них определяет возможность продолжения цикла. В этом случае синтаксис оператора цикла должен быть несколько иным.

Пример 10-16. Цикл while с несколькими условиями

Как и в случае с for, цикл while может быть записан в C-подобной нотации, с использованием двойных круглых скобок (см. так же Пример 9-28).

Пример 10-17. C-подобный синтаксис оформления цикла while

Стандартное устройство ввода stdin, для цикла while, можно перенаправить на файл с помощью команды перенаправления в конце цикла.

Оператор цикла until проверяет условие в начале каждой итерации, но в отличие от while итерация возможна только в том случае, если условие ложно.

Обратите внимание: оператор until проверяет условие завершения цикла ПЕРЕД очередной итерацией, а не после, как это принято в некоторых языках программирования.

Как и в случае с циклами for/in , при размещении ключевого слова do в одной строке с объявлением цикла, необходимо вставлять символ «;» перед do.

Источник

for цикл в Bash

Циклы — одна из фундаментальных концепций языков программирования. Циклы удобны, когда вы хотите запускать серию команд снова и снова, пока не будет достигнуто определенное условие.

В языках сценариев, таких как Bash, циклы полезны для автоматизации повторяющихся задач. В Bash доступны три основные конструкции цикла: for , while и until циклы.

В этом руководстве мы рассмотрим основы циклов for в Bash. Мы также покажем вам, как использовать операторы break и continue чтобы изменить ход цикла.

Стандартный for цикл в Bash

Цикл for выполняет итерацию по списку элементов и выполняет заданный набор команд.

Цикл for Bash имеет следующую форму:

Список может быть серией строк, разделенных пробелами, диапазоном чисел, выводом команды, массивом и т. Д.

Оберните струны

В приведенном ниже примере цикл будет перебирать каждый элемент в списке строк, и переменный element будет установлен на текущий элемент:

Цикл выдаст следующий результат:

Цикл по диапазону чисел

Вы можете использовать выражение последовательности, чтобы указать диапазон чисел или символов, задав начальную и конечную точки диапазона. Выражение последовательности принимает следующую форму:

Вот пример цикла, который перебирает все числа от 0 до 3:

Начиная с Bash 4, также можно указывать приращение при использовании диапазонов. Выражение принимает следующий вид:

Вот пример, показывающий, как увеличить на 5:

Перебирать элементы массива

Вы также можете использовать цикл for для перебора массива элементов.

В приведенном ниже примере мы определяем массив с именем BOOKS и перебираем каждый элемент массива.

Цикл for в Bash в стиле C

Синтаксис цикла for стиле C имеет следующий вид:

Часть INITIALIZATION выполняется только один раз при запуске цикла. Затем оценивается TEST . Если это ложь, цикл прекращается. Если TEST истинен, команды внутри цикла for выполняются, а часть STEP обновляется.

В следующем примере кода цикл начинается с инициализации i = 0 и перед каждой итерацией проверяется, является ли i ≤ 10 . Если true, он печатает текущее значение i и [увеличивает переменную] i на 1 ( i++ ), в противном случае цикл завершается.

Цикл повторится 1001 раз и выдаст следующий результат:

Операторы break и continue

Операторы break и continue могут использоваться для управления выполнением цикла for.

Оператор break

Оператор break завершает текущий цикл и передает управление программой оператору, следующему за завершенным оператором. Обычно он используется для завершения цикла при выполнении определенного условия.

В следующем примере мы используем оператор if для прекращения выполнения цикла, когда текущий повторяемый элемент становится равным «Lithium».

Оператор continue

Оператор continue завершает текущую итерацию цикла и передает управление программой следующей итерации цикла.

В следующем примере мы перебираем диапазон чисел. Когда текущий повторяемый элемент равен ‘2’, оператор continue заставит выполнение вернуться к началу цикла и продолжить следующую итерацию:

Примеров циклов for в Bash

Переименование файлов с пробелами в имени файла

В следующем примере показано, как переименовать все файлы в текущем каталоге с пробелом в его именах, заменив пробел на подчеркивание:

Давайте разберем код построчно:

  • Первая строка создает цикл for и выполняет итерацию по списку всех файлов с пробелом в имени. Выражение * * создает список.
  • Вторая строка применяется к каждому элементу списка и перемещает файл в новый, заменяя пробел знаком подчеркивания ( _ ). Часть $ использует расширение параметра оболочки для замены шаблона в параметре строкой.
  • done указывает конец сегмента цикла.

Изменение расширения файла

В следующем примере показано, как использовать цикл for в Bash for переименования всех файлов, оканчивающихся на .jpeg, в текущем каталоге путем замены расширения файла с .jpeg на .jpg.

Давайте проанализируем код построчно:

  • Первая строка создает цикл for и выполняет итерацию по списку всех файлов, заканчивающихся на ‘.jpeg’.
  • Вторая строка применяется к каждому элементу списка и перемещает файл в новый, заменяя «.jpeg» на «.jpg». $ чтобы удалить часть ‘.jpeg’ из имени файла, используя расширение параметра оболочки
  • done указывает конец сегмента цикла.

Выводы

Цикл for Bash используется для повторного выполнения заданного набора команд определенное количество раз.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Источник

Работа с файлами в каталоге при помощи циклов

Не все утилиты командной строки позволяют запускать одну команду для нескольких файлов одновременно, но с помощью сценариев оболочки и цикла for вы можете автоматически повторить любую команду.

Цикл – один из самых мощных аспектов в программировании. Он позволяет вам многократно применять одну и ту же логику к группе элементов, требуя при этом минимального количества кода.

В этом мануале мы научим вас перебирать файлы и применять команды с помощью оболочки Bash или zsh.

1: Перебор файлов

В этом мануале мы будем использовать цикл сценариев для оболочки. Этот конкретный метод управления встроен в оболочку командной строки Bash или zsh.

Вы можете применить следующие команды к любому каталогу по вашему выбору, но в этом мануале мы будем использовать тестовый каталог. Создайте каталог и несколько файлов, на которых можно потренироваться.

Сначала создайте каталог:

Затем перейдите в него:

С помощью команды touch создайте несколько текстовых файлов:

touch file-1.txt
touch file-2.txt
touch file-3.txt
touch file-4.txt
touch file-5.txt

Вы также можете быстро создать эти файлы, задав диапазон в скобках:

Чтобы просмотреть каталог и затем вывести имя файла, выполните следующую команду:

for FILE in *; do echo $FILE; done

Вы увидите следующий результат:

file-1.txt
file-2.txt
file-3.txt
file-4.txt
file-5.txt

Вы, наверное, заметили, что здесь используется подстановочный знак *. Он позволяет циклу for захватить каждый файл в каталоге. Вы можете изменить подстановочный знак на file-*, чтобы вывести все файлы, имена которых начинаются с file-, или на *.txt, чтобы вывести только текстовые файлы.

Теперь, когда вы знаете, как перебирать файлы в каталоге, давайте применим команду к этим файлам.

2: Применение команды

Все файлы, которые вы создали в предыдущем разделе, были созданы с помощью команды touch. Эти файлы пусты, поэтому применять к ним команду cat было бы не очень полезно.

К счастью, вы можете вставить текст в каждый файл с помощью одной команды, используя аналогичный цикл for.

Выполните следующую команду, чтобы вставить имя файла, новую строку и текст «Loops Rule!» в каждый файл:

for FILE in *; do echo -e «$FILE\nLoops Rule\!» > $FILE; done

Флаг -e в команде echo гарантирует сохранение новых строк.

Восклицательный знак нужно избежать с помощью обратного слеша, чтобы оболочка не интерпретировала символ как команду оболочки.

Теперь переберите каждый файл и выведите его содержимое:

for FILE in *; do cat $FILE; done

Теперь каждый файл содержит имя файла в первой строке и сообщение о том, что циклы классные, во второй строке.

file-1.txt
Loops Rule!
file-2.txt
Loops Rule!
file-3.txt
Loops Rule!
file-4.txt
Loops Rule!
file-5.txt
Loops Rule!

Дальше мы попробуем объединить эти примеры: сначала записать данные в файл, а затем отобразить его содержимое в одном цикле:

for FILE in *; do echo -e «$FILE\nLoops Rule\!» > $FILE; cat $FILE; done

Вы увидите следующий результат:

file-1.txt
Loops Rule!
file-2.txt
Loops Rule!
file-3.txt
Loops Rule!
file-4.txt
Loops Rule!
file-5.txt
Loops Rule!

При помощи точки с запятой (;) вы можете связать вместе любые необходимые команды.

Теперь давайте рассмотрим практический пример: создание резервных копий файлов.

3: Создание резервных копий файлов

Теперь, когда вы знаете, как работает цикл for, давайте попробуем сделать что-то полезное: возьмем каталог файлов и сделаем резервные копии с расширением .bak.

Выполните в своей оболочке следующую команду, которая создает резервную копию для каждого файла:

for FILE in *; do cp $FILE «$FILE.bak»; done;

С помощью команды ls отобразите все файлы:

Вы увидите такой результат:

total 40K
-rw-r—r— 1 8host 8host 29 Nov 7 18:34 file-1.txt
-rw-r—r— 1 8host 8host 29 Nov 7 18:41 file-1.txt.bak
-rw-r—r— 1 8host 8host 29 Nov 7 18:34 file-2.txt
-rw-r—r— 1 8host 8host 29 Nov 7 18:41 file-2.txt.bak
-rw-r—r— 1 8host 8host 29 Nov 7 18:34 file-3.txt
-rw-r—r— 1 8host 8host 29 Nov 7 18:41 file-3.txt.bak
-rw-r—r— 1 8host 8host 29 Nov 7 18:34 file-4.txt
-rw-r—r— 1 8host 8host 29 Nov 7 18:41 file-4.txt.bak
-rw-r—r— 1 8host 8host 29 Nov 7 18:34 file-5.txt
-rw-r—r— 1 8host 8host 29 Nov 7 18:41 file-5.txt.bak

Теперь у вас есть резервные копии всех ваших файлов. Их расширение указывает, что это резервные копии.

Создание копий в одном каталоге – это далеко не единственная задача, которую вы можете выполнить с помощью цикла. Вы можете также указать новый путь для файлов резервных копий. Следующая команда сохраняет резервные копии в папке /tmp/my-backups (если указанный каталог уже существует):

for FILE in *; do cp $FILE «/tmp/my-backups/$FILE.bak»; done;

Резервные копии будут созданы в новом каталоге.

Заключение

В этом мануале мы поэкспериментировали с циклом for и научились использовать его для перебора файлов и применения команд к нескольким фалам в каталоге.

Источник

Читайте также:  Что можно удалить с автозагрузки windows
Оцените статью