Перебор всех файлов linux

Содержание
  1. Работа с файлами в каталоге при помощи циклов
  2. 1: Перебор файлов
  3. 2: Применение команды
  4. 3: Создание резервных копий файлов
  5. Заключение
  6. [BASH] перебор всех подпапок
  7. Re: [BASH] перебор всех подпапок
  8. Re: [BASH] перебор всех подпапок
  9. Re: [BASH] перебор всех подпапок
  10. Re: [BASH] перебор всех подпапок
  11. Re: [BASH] перебор всех подпапок
  12. Re: [BASH] перебор всех подпапок
  13. Re: [BASH] перебор всех подпапок
  14. Re: [BASH] перебор всех подпапок
  15. Как перебирать файлы в каталоге с помощью Bash?
  16. 4 ответов
  17. Bash-скрипты, часть 2: циклы
  18. Циклы for
  19. Перебор простых значений
  20. Перебор сложных значений
  21. Инициализация цикла списком, полученным из результатов работы команды
  22. Разделители полей
  23. Обход файлов, содержащихся в директории
  24. Циклы for в стиле C
  25. Цикл while
  26. Вложенные циклы
  27. Обработка содержимого файла
  28. Управление циклами
  29. Команда break
  30. Команда continue
  31. Обработка вывода, выполняемого в цикле
  32. Пример: поиск исполняемых файлов
  33. Итоги

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

Не все утилиты командной строки позволяют запускать одну команду для нескольких файлов одновременно, но с помощью сценариев оболочки и цикла 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

Читайте также:  Сглаживание изображения windows 10

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

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

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

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

Заключение

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

Источник

[BASH] перебор всех подпапок

Сабж. Как сделать перебор всех папок в дирректории в которой выполняется скрипт (с выполнением одного и того же действия в каждой папке).

Re: [BASH] перебор всех подпапок

Re: [BASH] перебор всех подпапок

find . -type d -exec ;

Re: [BASH] перебор всех подпапок

> for i in `find -type d` > do > > done > > или что-то в этом духе

Неработает, скажем хочу я создать в каждой из подпапок новую папку:

for i in `find . -depth -type d` do cd $i mkdir bla-bla cd ../ done

> find . -type d -exec ; аналогично

Re: [BASH] перебор всех подпапок

Re: [BASH] перебор всех подпапок

Re: [BASH] перебор всех подпапок

find ./ -depth -type d -exec mkdir -p <>/subdir \;

отработало. Создало в каждом из подкаталогов subdir.

[slavaz@slavaz-nb find-test]$ uname -a
Linux slavaz-nb.home 2.6.25.10-47.fc8 #1 SMP Mon Jul 7 18:39:51 EDT 2008 i686 i686 i386 GNU/Linux
[slavaz@slavaz-nb find-test]$

Re: [BASH] перебор всех подпапок

роботает, но только почему он создает не только в подпапках но и в самой дирректории в которой запускается? Можно как то этого избежать?

Re: [BASH] перебор всех подпапок

1) find ./ -depth -type d ! -wholename ‘./’ -exec mkdir -p <>/subdir \;

Источник

Как перебирать файлы в каталоге с помощью Bash?

мне нужно написать сценарий, который запускает мою программу с разными аргументами, но я новичок в Bash. Я начинаю свою программу так:

./MyProgram.exe Data/data1.txt [Logs/data1_Log.txt] .

вот псевдокод для того, что я хочу сделать:

поэтому я действительно озадачен тем, как создать второй аргумент из первого, поэтому он выглядит как dataABCD_Log1.txt и запустите мою программу. Помощь очень ценится.

P.S. Я знаю, что есть аналогичные вопросы, но я нашел ничего о создании моего имени файла журнала.

4 ответов

пара заметок сначала: когда вы используете Data/data1.txt в качестве аргумента, если это действительно должно быть /Data/data1.txt (с ведущим слешем)? Кроме того, должен внешний цикл сканировать только для.txt файлы или все файлы в /Data? Вот ответ, предполагающий /Data/data1.txt и .только тхт файлы:

  • /Data/*.txt расширяется до путей к текстовым файлам в /Data (в том числе the / Data / part)
  • $( . ) запускает команду оболочки и вставляет ее вывод в этот момент в командной строке
  • basename somepath .txt выводит базовую часть somepath, С.txt удален с конца (например, /Data/file.txt -> file )

Если вам нужно запустить MyProgram с Data/file.txt вместо /Data/file.txt используйте «$» убрать Слэш. С другой стороны, если это действительно Data не /Data вы хотите сканировать, просто используйте for filename in Data/*.txt .

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

на name=$ замена (расширение параметров оболочки) удаляет ведущий путь до последнего / .

на base=$ замена удаляет замыкающие .txt . Это немного сложнее, если расширения могут различаться.

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

идея состоит в том, чтобы запустить поиск в подрешетке и отправить ошибки в /dev/null, чтобы вы никогда не перебирали ошибку об отсутствующих файлах.

Источник

Bash-скрипты, часть 2: циклы

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

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

Циклы for

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

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

Читайте также:  Android file manager mac os

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

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

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


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

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

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

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

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


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

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

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

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


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

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

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

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

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

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

Если 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 . В таком цикле можно задать команду проверки некоего условия и выполнять тело цикла до тех пор, пока проверяемое условие возвращает ноль, или сигнал успешного завершения некоей операции. Когда условие цикла вернёт ненулевое значение, что означает ошибку, цикл остановится.

Читайте также:  Windows create file example

Вот схема организации циклов 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-скриптах, о том, как их запускать, как ими управлять. Теперь вы умеете обрабатывать в циклах строки с разными разделителями, знаете, как перенаправлять данные, выведенные в циклах, в файлы, как просматривать и анализировать содержимое директорий.

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

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

Источник

Оцените статью