Вывести список всех исполняемых файлов в заданном каталоге на экран и в файл

Обновлено: 04.07.2024

Как я могу найти только исполняемые файлы в определенном каталоге в Linux?

Проверка исполняемых файлов может выполняться с помощью -perm (не рекомендуется) или -executable (рекомендуется, поскольку он учитывает ACL). Чтобы использовать параметр -executable :

, если вы хотите найти только исполняемые файлы, а не каталоги, доступные для поиска, в сочетании с -type f :

Используйте опцию -perm для поиска. Это найдет файлы в текущем каталоге, которые либо исполняются их владельцем, либо членами группы, либо другими:

Я просто нашел еще один вариант, который присутствует, по крайней мере, в GNU find 4.4.0:

Это должно работать еще лучше, потому что ACL также рассматриваются.

Я знаю, что в этом вопросе конкретно упоминается Linux, но поскольку это первый результат в Google, я просто хотел добавить ответ, который я искал (например, если вы - как и я на данный момент, принужден вашим работодателем использовать система не GNU /Linux).

Протестировано на macOS 10.12.5

У меня есть другой подход, в случае, если вы действительно хотите просто сделать что-то с исполняемыми файлами - и не обязательно заставить заставить фильтр фильтровать себя:

Я предпочитаю это, потому что он не полагается на -executable , который является специфичным для платформы; и он не полагается на -perm , который является немного тайным, специфичным для бит-платформы и, как написано выше, требует, чтобы файл исполнялся для всех (а не только для вас).

-type f важен, потому что в каталогах * nix должны быть исполняемыми, чтобы быть обходимыми, и чем больше запросов находится в команде find , тем больше память будет эффективной вашей командой.

Во всяком случае, просто предлагая другой подход, поскольку * nix - это земля в миллиард подходов.

Файл, помеченный как исполняемый файл, не обязательно должен быть исполняемым или загружаемым файлом или объектом.

Вот что я использую:

Как вентилятор одного лайнера .

Использование «xargs» для вывода результата из команды find (с помощью print0 для правильной обработки имен файлов с пробелами). Теперь у нас есть список исполняемых файлов, и мы предоставляем их один за другим в качестве параметра для команды «файл». Затем grep для выражения ASCII для игнорирования двоичных файлов. Пожалуйста, замените -executable в команде find на какой стиль вы предпочитаете (см. Более ранние ответы) или что работает на вашей «ОС NIX

Мне нужно было найти файлы с eval в скриптах, принадлежащих root, поэтому создано следующее, чтобы помочь найти недостатки в личной эскалации, когда пользователь root запускает скрипты с небезопасными параметрами .

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

Формат командной строки:

DIR [диск:][путь][имя_файла] [/A[[:]атрибуты]] [/B] [/C] [/D] [/L] [/N] [/O[[:]порядок]] [/P] [/Q] [/S] /T[[:]время]] [/W] [/X] [/4]

Параметры командной строки:

[диск:][путь][имя_файла] - Диск, каталог и/или файлы, которые следует включить в список.

/A - Вывод файлов с указанными атрибутами:

D Каталоги
R Доступные только для чтения
H Скрытые файлы
A Файлы для архивирования
S Системные файлы
Префикс "-" имеет значение НЕ
-S НЕ системные файлы.

/B - Вывод только имен файлов.

/C - Применение разделителя групп разрядов для вывода размеров файлов (по умолчанию). Для отключения этого режима служит ключ /-C.

/D - Вывод списка в несколько столбцов с сортировкой по столбцам.

/L - Использование нижнего регистра для имен файлов.

/N - Отображение имен файлов в крайнем правом столбце.

/O - Сортировка списка отображаемых файлов.

Порядок: N По имени (алфавитная), S По размеру (сперва меньшие), E По расширению (алфавитная), D По дате (сперва более старые), G Начать список с каталогов. Префикс "-" имеет значение НЕ

/P - Пауза после заполнения каждого экрана.

/Q - Вывод сведений о владельце файла.

/R - Отображение альтернативных потоков файлов.

/S - Вывод списка файлов из указанного каталога и его подкаталогов.

/T - Выбор поля времени для отображения и сортировки

/X - Отображение коротких имен для файлов, чьи имена не соответствуют стандарту 8.3. Формат аналогичен выводу с ключом /N, но короткие имена файлов выводятся слева от длинных. Если короткого имени у файла нет, вместо него выводятся пробелы.

/4 - Вывод номера года в четырехзначном формате

Стандартный набор ключей можно записать в переменную среды DIRCMD. Для отмены их действия введите в команде те же ключи с префиксом "-", например: /-W.

Примеры использования команды DIR:

DIR /? - отобразить справку по использованию команды.

DIR - отобразить список файлов и подкаталогов текущего каталога.

DIR /P - отобразить список файлов и подкаталогов текущего каталога в режиме постраничного вывода на экран. При выполнении команды DIR с данным ключом, после заполнения экрана, вывод информации приостанавливается до нажатия какой-либо клавиши. Аналогично выполнению команды DIR в цепочке с командой MORE - DIR | MORE

DIR > C:\listdir.txt - отобразить список файлов и подкаталогов текущего каталога с выводом результатов в текстовый файл .

DIR C:\WINDOWS\*.dll - отобразить список файлов с расширением dll из каталога C:\WINDOWS

DIR C:\WINDOWS\SYSTEM32\X*.* - отобразить список файлов из каталога C:\WINDOWS\SYSTEM32, имена которых начинаются с символа X

DIR C:\WINDOWS\SYSTEM32\*Y.EXE - отобразить список файлов с расширением .exe из каталога C:\WINDOWS\SYSTEM32, имена которых заканчиваются символом Y

DIR C:\WINDOWS\system32\. t.* - отобразить список файлов, имя которых содержит 3 любых символа ( . ) и символ t

DIR C:\WINDOWS\SYSTEM32\*.* /A:H - отобразить список скрытых файлов и подкаталогов из каталога C:\WINDOWS\SYSTEM32

DIR C:\WINDOWS\SYSTEM32\*.* /A:H - отобразить список скрытых файлов и подкаталогов из каталога C:\WINDOWS\SYSTEM32

DIR C:\ /A:-AH - отобразить список скрытых ( H ) файлов и подкаталогов из корневого каталога диска C: без атрибута "Архивный" ( -A )

DIR C: /A:DH - отобразить список скрытых каталогов в корне диска C:

dir c:\ /a:DH /d - тоже самое, но с отображением информации в несколько столбцов, с сортировкой имен в алфавитном порядке. Пример результата:

Том в устройстве C имеет метку C

Серийный номер тома: 1884-ABEC

Содержимое папки c:\

[Config.Msi]               [System Volume Information]

0 файлов 0 байт

5 папок 103 593 283 584 байт свободно

Та же информация, но параметр /D не задан:

Том в устройстве C имеет метку C

Серийный номер тома: 1884-ABEC

Содержимое папки c:\

16.01.2013 11:22 Config.Msi

26.04.2012 09:05 Fix-It

25.07.2011 11:31 RECYCLER

03.08.2011 16:06 System Volume Information

24.04.2008 17:36 VCOM

0 файлов 0 байт

5 папок 103 593 283 584 байт свободно

Для сортировки имен отображаемых файлов и каталогов используется параметр /O

/O:N - сортировать по имени в алфавитном порядке( Name ) С использованием знака " - " - сортировать в обратном порядке.

/O:S - сортировать по размеру в возрастающем порядке( Size ). Со знаком " - " - сортировать в порядке убывания размеров файлов.

/O:E - сортировать по расширению имени файла ( Extension ) /O:-E - в обратном порядке

/O:D - сортировать по дате и времени модификации файла или каталога.

/O:-D - в обратном порядке ( от новых к старым )

/O:G - сначала отображать список каталогов, затем - файлов.

Использование параметра /T позволяет отсортировать списки файлов и каталогов в соответствии с отметками времени ( Time Stamp ), хранящимися в файловой системе Windows для каждого из них:

/T:C - сортировать по времени создания ( Creation )

/T:A - сортировать по времени доступа ( Access )

/T:W - сортировать по времени модификации , последней операции записи ( Written ). Этот параметр используется по умолчанию.

dir %temp%\*.* /a:H /TC - отобразить все скрытые файлы и папки в каталоге временных файлов, заданном переменной среды окружения TEMP , и отсортировать их в порядке возрастания даты создания.

dir %SystemRoot%\system32\*.exe /b /a:H /TA - отобразить список скрытых исполняемых файлов в системном каталоге и отсортировать их по времени последнего доступа.

DIR C:\ /X - отобразить список файлов и каталогов в корневом каталоге диска C: с отображением коротких имен для файлов, чьи имена не соответствуют стандарту 8.3. Стандарт 8.3 означает, что для имени файла отводится не более 8 символов, а для расширения - не более 3-х. Этот стандарт использовался в устаревших операционных системах семейства MS-DOS, не поддерживавших длинные имена файлов. Длинные имена преобразуются в короткие с использованием первых шести символов и конструкции

28.01.2013 16:48                              DOCUMENT
DOCUME

2     DOCUMENTS
DOCUME

1      Documents and Settings
В примере отображается список из 3-х каталогов:

DOCUMENT - имя каталога содержит 8 символов и не преобразуется в стандарт 8.3

DOCUMENTS - имя содержит 9 символов и в формате 8.3 представлено как DOCUME

Documents and Settings - представлено как DOCUME

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

Параметры командной строки команды DIR можно определить в переменной окружения DIRCMD.

SET DIRCMD=/O:N /B /P - определить параметры /O , /B и /P .

После этого, выполнение команды DIR без параметров будет аналогично выполнению команды:

Если в командной строке команды DIR задан параметр, определенный в переменной DIRCMD, то его значение более приоритетно, и будет использоваться в процессе выполнения данной команды.

Для расширения возможностей команды DIR можно воспользоваться объединением ее в цепочку с командой поиска текстовой информации FIND

DIR C:\*.* /s | FIND "28.01.2013" - отобразить список всех файлов и каталогов диска C: имеющих отметку времени "28 января 2013 г."

Для обработки отдельных полей из строк вывода результатов команды DIR можно воспользоваться командой FOR

Параметр командной строки /R применим только в Windows 7 и более поздних версиях. Он используется для отображения альтернативных потоков файлов в файловой системе NTFS.

dir /r - отобразить список файлов текущего каталога с именами альтернативных потоков.

dir /r proxylist.zip - отобразить список альтернативных потоков файла proxylist.zip . Пример отображаемой информации:

455 881 proxylist.zip
          26 proxylist.zip:$CmdZnID:$DATA
          26 proxylist.zip:Zone.Identifier:$DATA

Альтернативные потоки файлов используются для хранения данных, не связанных с содержимым основного потока (собственно содержимого файла) и на практике применяются для привязки дополнительной информации к этому содержимому. Так, например, многие антивирусы хранят в альтернативных потоках контрольные суммы проверенных на заражение файлов, а система безопасности использует их для определения факта скачивания файлов по сети. Подробнее об альтернативных потоках - в статье Альтернативные потоки NTFS, или как Windows определяет, что файл был загружен из Интернет

Для определённых целей может потребоваться составить список файлов, содержащихся в папке. Если таковых немного, то задачу можно выполнить вручную без особых затруднений, но если в папке десятки, сотни или даже тысячи файлов, то пытаться составить их список вручную это бесполезная трата времени. Можно ли этот процесс как-то автоматизировать?

Как сделать список файлов в папке

Автоматическое создание списка файлов

К счастью, функционал Windows и других программных решений, позволяет создавать списки файлов в папках в автоматическом порядке. Данные списки можно потом будет без проблем скопировать в текстовый файл и редактировать по мере необходимости.

Рассмотрим все имеющиеся способы создания такого списка.

Вариант 1: «Командная строка»

Этот способ является стандартным и не требует от пользователя каких-либо особых умений, за исключением базового владения «Командной строкой». Итак, инструкция к данному варианту выглядит следующим образом:

  1. Перейдите в ту папку, список файлов из которой вы хотели бы получить.
  2. Теперь зажмите Shift на клавиатуре и нажмите правой кнопкой мыши по пустому месту в окне «Проводника».
  3. Должно появится контекстное меню, где требуется выбрать вариант «Запуск командной строки» или «Открыть окно команд здесь». В случае с последними версиями Windows 10 такого пункта может не быть. Вместо этого нужно нажать на «Запустить окно PowerShell здесь». PowerShell – это новый аналог «Командной строки», который Майкрософт активно внедряет в последние версии Windows 10. По сути отличий в функционале нет никаких.

Открытие командной строки через контекстное меню

  • dir /b>spisok.txt Данная команда сохраняет только имена файлов в файл spisok.txt. Вы можете вместо него указать любое другое название, какое вам будет удобно, но учтите, что оно не должно содержать кириллических символов;
  • dir /s>spisok.txt Сохраняет не только имена файлов, содержащихся в папке, но и имена папок и подпапок, которые могут быть расположена в основной папке.

Ввод команды на создание списка файлов из командной строки

Всю информацию из него можно скопировать в документ Word, так как последний удобнее редактировать. К тому же, если в папке содержались файлы или другие папки в названии которых присутствовали кириллические символы, то в «Блокноте» таковые могут отображаться некорректно, так как нужные кодировки не поддерживаются.

Вариант 2: Использование BAT-файла

Данный способ тоже не отличается какой-либо сложностью, плюс даёт почувствовать себя немного программистом. Суть заключается в создании специального файла с алгоритмом, который выведет список всех элементов в папке в отдельный текстовый файл. Итак, рассмотрим инструкцию к этому варианту более подробно:

    Создайте в любом месте на компьютере текстовый файл. Для этого нажмите правой кнопкой мыши и в меню выберите пункт «Создать». Из открывшегося подменю выберите вариант «Текстовый файл».

Создание текстового документа

echo %date% %time% >spisok.txt

Написание алгоритма для BAT-файла

Сохранение текстового документа как

Сохранение текстового файла как BAT-файла

Содержимое данного файла также можно перенести в текстовый документ MS Word. Однако в этом случае проблем с кодировкой и неверным отображением кириллических символов не наблюдается.

Вариант 3: DirLister

Данное бесплатное ПО не требуется установки на компьютер и с его помощью вы можете создать список всех элементов в той или иной папке. Инструкция по её использованию выглядит следующим образом:

  1. Перейдите на официальный сайт разработчика и скачайте архив с программой.
  2. Распакуйте архив, вытащив от туда исполняемый EXE-файл.
  3. Запустите его.

Работа с DirLister

Вариант 4: Total Commander

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

  1. В окне Total Commander откройте нужную папку.
  2. В верхнем меню нажмите на пункт «Выделение». Появится контекстное меню, где нужно нажать на вариант «Выделить всё».
  3. Затем в этом же меню выберите пункт «Копировать имена файлов в буфер обмена».

Окно Total-Commander

Вариант 5: Браузер

Во всех современных браузерах, будь то Opera, Google Chrome, Yandex и т.д., есть функция просмотра содержимого папок и некоторых файлов, расположенных на компьютере.

Инструкция к этому варианту выглядит следующим образом:

  1. Откройте «Проводник». Выберите при помощи щелчка левой кнопкой мыши ту папку, которую хотите просмотреть в браузере.
  2. Перетащите эту папку в любой удобный для вас браузер. В данном случае рассматривается вариант с Opera.

Открытие списка файлов через браузер

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

Зачем может понадобиться список файлов из командной строки

Если вам когда-нибудь понадобиться получить список всех файлов, то вы обнаружите пренеприятнейшую новость. Интерфейс проводника Windows не позволяет вам это сделать в простой и понятной форме. И вроде бы задача до безумия проста, и вроде перед глазами все необходимые файлы, но. Однако, это можно очень просто сделать с помощью командной строки (cmd). Кроме того, командная строка позволит вам отфильтровать только необходимые файлы, например, только mp3. В данном случае мы будем использовать специальную команду "dir". Скорее всего, опытным пользователям это команда хорошо знакома, поэтому статья будет для них не интересной. Но, для большинства обычных пользователей она окажется весьма полезной.

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

Если вам кажется, что это никогда вам в жизни не пригодится, то вы ошибаетесь. Практически каждый пользователь каждый день в неявном виде использует списки файлов. Это и поиск необходимого документа среди всех ваших документов. Это музыка. Это фотографии. Это различный экспорт файлов в ваших приложениях. Банально, тот же плей лист. Просто вы никогда не сталкивались с такими простыми задачами, как "передать список файлов, например, в техподдержку", "коллективно выбрать необходимую вам музыку из всего списка" (причем обычно это делается на бумаге, да существует огромное количество "модных девайсов", но они никогда не заменят такие простые вещи, как бумагу и карандаш), "загрузить список в новое приложение" (далеко не во всех приложениях качественно реализован импорт), "использование для технических нужд тех же консольных приложений" (например, различная пакетная обработка файлов; конечно, рядовой пользователь никогда не будет этого делать, но. ) и многое многое другое.

Выводим список файлов папки и ее подпапках на экран командной строки

Как получить список файлов через командную строку (cmd)

  • Откройте командную строку в необходимой папке (см. предыдущую статью)
  • Введите "dir" (без кавычек) и нажмите Enter. Вы получите список файлов (см. картинку)
  • Если вам необходимо перечислить файлы во всех вложенных папках, то вместо "dir" используйте "dir /s" (вводить без кавычек)

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

Создаем текстовый файл со списком файлов в командной строке

Как получить список файлов через командную строку (cmd)

Для того чтобы выведенный список сохранить в текстовый файл, используется специальный символ перенаправления потока ">" (без кавычек).

  • Откройте командную строку в необходимой папке.
  • Введите "dir > listmyfolder.txt" (без кавычек) и нажмите Enter. Весь список сохранится в файле "listmyfolder.txt".
  • Если вам необходимо так же сохранить файлы и из всех вложенных каталогов, то используйте команду "dir /s > listmyfolder.txt" (без кавычек)

Файл "listmyfolder.txt" будет создан в той же папке, в которой вы находитесь. Небольшой уточнение по поводу файла, вы можете называть его как вам будет угодно, задавать ему абсолютно любое расширение. Каких-то специальных ограничений нет, кроме тех, что требует система Windows к названиям файлов. Так же вы можете использовать полные пути, для сохранения списка в другом каталоге. Например, вы хотите сохранить файл на диске "F:" в каталоге "list". Для этого вам необходимо будет использовать такую команду "dir > F:\list\listmyfolder.txt" (без кавычек). Как видите ничего сложно нет.

Создаем текстовый файл со списком файлов определенного расширения в командной строке

Далеко не всегда вам необходимо получить все файлы в каталоге. Например, вы хотите получить только список фотографий или только музыки. Согласитесь, что вручную изменять полный список файлов - скучная и рутинная задача. Чтобы облегчить всем жизнь, командная строка поддерживает специальный символ *, с помощью которого можно составить так называемые регулярные выражения (порой их называют маской). Не стоит пугаться страшных слов, никаких сложных конструкций в варианте "/d+?[\.2345]?d+[\.]?mp3/$" вы не встретите. Далее мы приведем простые примеры, как вы можете получить списки всех ваших mp3 и jpg файлов, т.е. музыки и фотографий.

Получение всех mp3 файлов в папке и во всех вложенных папках из командной строки

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

В файле "listmp3.txt" будет список всех ваших MP3-файлов.

Получение всех фотографий в формате JPEG в папке и во всех вложенных папках из командной строки

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

В файле "listjpg.txt" будет список всех ваших фотографий в формате JPEG.

Получение простого формата списка из командной строки

Как получить список файлов через командную строку (cmd)

Вышеописанные команды сформируют списки, которые дополнительно будут включать информацию о файлах, а именно размер и дату создания. Но, такая информация далеко не всегда необходима. Порой нам нужен именно простой список файлов. Чтобы сформировать такой список, необходимо добавить в команду специальный параметр "/b". В итоге команда будет выглядеть следующим образом:

Если вам интересно, то есть много других полезных команд. Чтобы узнать полный список команд, вам необходимо ввести команду "help". Конечно, краткое описание команды вряд ли поможет вам представить, как можно использовать команду. Поэтому существует специальный параметр "/?". Если вы его введете сразу после команды, то в окне консоли появится небольшой мануал по использованию команды и ее параметров.

Предупреждение: Если вы не сильно разбираетесь в том, что именно делает команда, то настоятельно вам рекомендуем сперва прочитать о ее применении, хотя бы в поисковике. Неаккуратное и неправильное использование команд может привести к неприятным последствиям. Конечно, можно использовать образы диска перед тестами, но, согласитесь, что это сильно накладно.

В прошлый раз мы рассказали об основах программирования для bash. Даже то немногое, что уже разобрано, позволяет всем желающим приступить к автоматизации работы в Linux. В этом материале продолжим рассказ о bash-скриптах, поговорим об управляющих конструкциях, которые позволяют выполнять повторяющиеся действия. Речь идёт о циклах for и while , о методах работы с ними и о практических примерах их применения.

image


Внимание: в посте спрятана выгода!

Циклы for

Оболочка bash поддерживает циклы for , которые позволяют организовывать перебор последовательностей значений. Вот какова базовая структура таких циклов:


В каждой итерации цикла в переменную var будет записываться следующее значение из списка list . В первом проходе цикла, таким образом, будет задействовано первое значение из списка. Во втором — второе, и так далее — до тех пор, пока цикл не дойдёт до последнего элемента.

Перебор простых значений

Пожалуй, самый простой пример цикла for в bash-скриптах — это перебор списка простых значений:


Ниже показаны результаты работы этого скрипта. Хорошо видно, что в переменную $var последовательно попадают элементы из списка. Происходит так до тех пор, пока цикл не дойдёт до последнего из них.



Простой цикл for

Обратите внимание на то, что переменная $var сохраняет значение при выходе из цикла, её содержимое можно менять, в целом, работать с ней можно как с любой другой переменной.

Перебор сложных значений

В списке, использованном при инициализации цикла for , могут содержаться не только простые строки, состоящие из одного слова, но и целые фразы, в которые входят несколько слов и знаков препинания. Например, всё это может выглядеть так:


Вот что получится после того, как этот цикл пройдётся по списку. Как видите, результат вполне ожидаем.



Перебор сложных значений
TNW-CUS-FMP — промо-код на 10% скидку на наши услуги, доступен для активации в течение 7 дней"

Инициализация цикла списком, полученным из результатов работы команды

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


В этом примере задействована команда cat , которая читает содержимое файла. Полученный список значений передаётся в цикл и выводится на экран. Обратите внимание на то, что в файле, к которому мы обращаемся, содержится список слов, разделённых знаками перевода строки, пробелы при этом не используются.



Цикл, который перебирает содержимое файла

Тут надо учесть, что подобный подход, если ожидается построчная обработка данных, не сработает для файла более сложной структуры, в строках которого может содержаться по несколько слов, разделённых пробелами. Цикл будет обрабатывать отдельные слова, а не строки.

Что, если это совсем не то, что нужно?

Разделители полей

Причина вышеописанной особенности заключается в специальной переменной окружения, которая называется IFS (Internal Field Separator) и позволяет указывать разделители полей. По умолчанию оболочка bash считает разделителями полей следующие символы:

  • Пробел
  • Знак табуляции
  • Знак перевода строки

Для того, чтобы решить проблему, можно временно изменить переменную среды IFS . Вот как это сделать в bash-скрипте, если исходить из предположения, что в качестве разделителя полей нужен только перевод строки:


После добавления этой команды в bash-скрипт, он будет работать как надо, игнорируя пробелы и знаки табуляции, считая разделителями полей лишь символы перевода строки.


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



Построчный обход содержимого файла в цикле for

Разделителями могут быть и другие символы. Например, выше мы выводили на экран содержимое файла /etc/passwd . Данные о пользователях в строках разделены с помощью двоеточий. Если в цикле нужно обрабатывать подобные строки, IFS можно настроить так:

Обход файлов, содержащихся в директории

Один из самых распространённых вариантов использования циклов for в bash-скриптах заключается в обходе файлов, находящихся в некоей директории, и в обработке этих файлов.

Например, вот как можно вывести список файлов и папок:


Если вы разобрались с предыдущим материалом из этой серии статей, вам должно быть понятно устройство конструкции if-then , а так же то, как отличить файл от папки. Если вам сложно понять вышеприведённый код, перечитайте этот материал.

Вот что выведет скрипт.



Вывод содержимого папки

Обратите внимание на то, как мы инициализируем цикл, а именно — на подстановочный знак «*» в конце адреса папки. Этот символ можно воспринимать как шаблон, означающий: «все файлы с любыми именами». он позволяет организовать автоматическую подстановку имён файлов, которые соответствуют шаблону.

При проверке условия в операторе if , мы заключаем имя переменной в кавычки. Сделано это потому что имя файла или папки может содержать пробелы.

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

Если вы знакомы с языком программирования C, синтаксис описания bash-циклов for может показаться вам странным, так как привыкли вы, очевидно, к такому описанию циклов:


В bash-скриптах можно использовать циклы for , описание которых выглядит очень похожим на циклы в стиле C, правда, без некоторых отличий тут не обошлось. Схема цикла при подобном подходе выглядит так:


На bash это можно написать так:


А вот рабочий пример:


Этот код выведет список чисел от 1 до 10.



Работа цикла в стиле C

Цикл while

Конструкция for — не единственный способ организации циклов в bash-скриптах. Здесь можно пользоваться и циклами while . В таком цикле можно задать команду проверки некоего условия и выполнять тело цикла до тех пор, пока проверяемое условие возвращает ноль, или сигнал успешного завершения некоей операции. Когда условие цикла вернёт ненулевое значение, что означает ошибку, цикл остановится.

Вот схема организации циклов while
while команда проверки условия
do
другие команды
done

Взглянем на пример скрипта с таким циклом:


На входе в цикл проверяется, больше ли нуля переменная $var1 . Если это так, выполняется тело цикла, в котором из значения переменной вычитается единица. Так происходит в каждой итерации, при этом мы выводим в консоль значение переменной до его модификации. Как только $var1 примет значение 0, цикл прекращается.



Результат работы цикла while

Если не модифицировать переменную $var1 , это приведёт к попаданию скрипта в бесконечный цикл.

Вложенные циклы

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


Ниже показано то, что выведет этот скрипт. Как видно, сначала выполняется первая итерация внешнего цикла, потом — три итерации внутреннего, после его завершения снова в дело вступает внешний цикл, потом опять — внутренний.



Вложенные циклы

Обработка содержимого файла

Чаще всего вложенные циклы используют для обработки файлов. Так, внешний цикл занимается перебором строк файла, а внутренний уже работает с каждой строкой. Вот, например, как выглядит обработка файла /etc/passwd :


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



Обработка данных файла

Такой подход можно использовать при обработке файлов формата CSV, или любых подобных файлов, записывая, по мере надобности, в переменную окружения IFS символ-разделитель.

Управление циклами

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

Команда break

Эта команда позволяет прервать выполнение цикла. Её можно использовать и для циклов for , и для циклов while :


Такой цикл, в обычных условиях, пройдётся по всему списку значений из списка. Однако, в нашем случае, его выполнение будет прервано, когда переменная $var1 будет равна 5.



Досрочный выход из цикла for

Вот — то же самое, но уже для цикла while :


Команда break , исполненная, когда значение $var1 станет равно 5, прерывает цикл. В консоль выведется то же самое, что и в предыдущем примере.

Команда continue

Когда в теле цикла встречается эта команда, текущая итерация завершается досрочно и начинается следующая, при этом выхода из цикла не происходит. Посмотрим на команду continue в цикле for :


Когда условие внутри цикла выполняется, то есть, когда $var1 больше 5 и меньше 10, оболочка исполняет команду continue . Это приводит к пропуску оставшихся в теле цикла команд и переходу к следующей итерации.



Команда continue в цикле for

Обработка вывода, выполняемого в цикле

Данные, выводимые в цикле, можно обработать, либо перенаправив вывод, либо передав их в конвейер. Делается это с помощью добавления команд обработки вывода после инструкции done .

Например, вместо того, чтобы показывать на экране то, что выводится в цикле, можно записать всё это в файл или передать ещё куда-нибудь:


Оболочка создаст файл myfile.txt и перенаправит в этот файл вывод конструкции for . Откроем файл и удостоверимся в том, что он содержит именно то, что ожидается.



Перенаправление вывода цикла в файл

Пример: поиск исполняемых файлов

Давайте воспользуемся тем, что мы уже разобрали, и напишем что-нибудь полезное. Например, если надо выяснить, какие именно исполняемые файлы доступны в системе, можно просканировать все папки, записанные в переменную окружения PATH . Весь арсенал средств, который для этого нужен, у нас уже есть, надо лишь собрать всё это воедино:


Такой вот скрипт, небольшой и несложный, позволил получить список исполняемых файлов, хранящихся в папках из PATH .



Поиск исполняемых файлов в папках из переменной PATH

Итоги

Сегодня мы поговорили о циклах for и while в bash-скриптах, о том, как их запускать, как ими управлять. Теперь вы умеете обрабатывать в циклах строки с разными разделителями, знаете, как перенаправлять данные, выведенные в циклах, в файлы, как просматривать и анализировать содержимое директорий.

Читайте также: