Linux bash файлы по списку

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

Работа с файлами и каталогами в командной оболочке Bash

Содержание:

Bash (Bourne Again Shell) — это командная оболочка, использующаяся в таких UNIX-системах, как Linux или MacOS. Она позволяет управлять компонентами ОС с помощью определённых запросов, которые вводятся в консоль или берутся из скрипта.

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

Работа с файлами и каталогами

Работа с файлами и каталогами в Linux через Bash осуществляется с учетом иерархического принципа их классификации. Иерархическая структура файловой системы Linux напоминает «дерево». Существует корневой каталог, который является начальным для всей ОС, а в нём, соответственно, масса других подкаталогов.

Такой же принцип используется для командной строки. Файлы и каталоги берут начало из корневого узла « / », который является начальной точкой для всех элементов.

Ниже представлен стандартный перечень подкаталогов, встречающийся в большинстве UNIX-систем.

Каталог Содержимое
/bin Бинарные версии файлов (в том числе для командной оболочки).
/dev Псевдофайлы, представляющие собой аппаратные средства, подключённые к устройству.
/etc Большая часть конфигурационных файлов.
/lib Библиотеки для системных приложений.
/opt Необязательные компоненты системы или приложения.
/tmp Временные файлы.
/usr Пользовательские компоненты.
/var Файлы приложений (в том числе системные журналы, кэши и т. д.).

Команды для каталогов

Существуют конкретные команды, предназначенные для работы с каталогами. Далее будут приведены самые важные из них.

Список основных команд

  • pwd — вывод полного пути к текущему каталогу.
  • cd — переход с текущего каталога на домашний пользовательский.
  • cd dirname — перейти в папку «dirname».
  • cd / — переход по директориям относительно корневого каталога.
  • ls — просмотреть список файлов в каталоге.
  • ls -d */ — просмотреть список папок в текущем каталоге.
  • ls dirname — вывод содержимого каталога «dirname» на экран.
  • mkdir dirname — создать папку с наименованием «dirname».
  • rmdir dirname — удалить папку «dirname».
  • rm -rf dirname — удалить папку «dirname» с её содержимым (опция -r) без предупреждения пользователя (опция -f).
  • du -h dirname — размер папки «dirname».

Помимо этого, существуют полезные сокращения. Например, текущая директория обозначается с помощью « . ». Знак « .. » позволяет задействовать родительский каталог. Для представления домашней директории используется «

Пример использования сокращений:

Команды для файлов

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

Список основных команд

  • touchfile — создать файл.
  • realpath file — узнать абсолютный путь к файлу.
  • stat file1 — получение информации о «file1» (размер файла, дата создания файла и т. д.) и проверка существования файла.
  • cat > file — запись в файл.
  • catfile — чтение файла.
  • echo текст >> file — дописать в файл текст.
  • find file — поиск файла.
  • mcedit file — редактирование файла (также можно использовать редакторы Nano, Vim и другие).
  • cat file1 file2 > file12 — объединение файлов.
  • sh filename — запустить файл со сценарием Bash.
  • ./filename — запустить исполняемый файл.
  • cp file1 file2 — копировать файл «file1» с переименованием на «file2». Произойдёт замена файлов, если элемент с таким же названием существует.
  • mv file1 file2 — переименовать файл «file1» в «file2».
  • mv filename dirname — переместить файл «filename» в каталог «dirname».
  • less filename — открыть файл в окне терминала.
  • file filename — определение типа файла.
  • head filename — вывод нескольких начальных строк из файла на экран (построчное чтение файла). По умолчанию строк 10.
  • tail filename — вывод нескольких конечных строк из файла на экран.
  • diff file1 file2 — сравнение файлов.
  • grep text filename — поиск и вывод строк из файла, содержащих «text».
  • rm filename — удалить файл.

Подробную информацию об утилитах можно получить, воспользовавшись справочной службой: « man ».

Пример получения справки по работе с программой rm: « man rm ».

Перенаправление данных

Перенаправление ввода-вывода в файл осуществляется с помощью специальных знаков. Для вывода используются « > » и « >> », а для ввода — « ».

Пример вывода « ls » в файл, а не на экран:

Новый файл создаётся автоматически. В случае существования элемента с таким же наименованием, произойдёт перезапись. Чтобы этого избежать, необходимо использовать « >> ». Тогда данные будут дописываться в документ.

Читайте также:  Css body size windows

Пример ввода, при котором информация выносится из файла с помощью команды « sort »:

Генерация имён файлов в Bash

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

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

Итак, теперь остаётся разобраться с вопросом составления шаблонов. Сейчас будут приведены основные конструкции для осуществления генерации имён. Чаще всего для отбора файлов применяется символ: « * ». В случае использования этого знака в чистом виде, Bash выберет все элементы в каталоге без исключений.

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

Символ звёздочки позволяет командному интерпретатору выделить все файлы, начинающиеся с «file». При этом последующая часть наименования будет проигнорирована.

Знак « * » можно использовать также в начале или с обеих сторон шаблона.

Кроме того, сгенерировать имена можно, взяв за основу расширение файла. Например:

Начни экономить на хостинге сейчас — 14 дней бесплатно!

Источник

bash. удаление файлов по списку из файла.

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

вариант с построчным чтением и выполнением rm не предлагать, он ацки долгий.

cat list | xargs rm -rv

А если my.txt четырёх гигов размером?

если список длинный, rm ругнется и не удалит.

ну.. список не будет более мегабайта, полагаю.

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

О, знаток шелла? Попытка обойти граничные случаи?
Представь что публики нет, играть ни на кого не надо: будь честен хотя бы с самим собой и перечисли сам случаи, когда твой вариант не будет работать

Идеальный вариант в студию, будь добр

cat file | while read

А, ну да, пробелы не эксейпятся, если ты об этом

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

ТС не устраивает вариант с построчным чтением. А как известно клиент всегда прав

При достаточно большом списке это будет неизбежно. А так — да, получается дольше.

Кстати, в твоём случае пробелы тоже не ескейпятся, так что окромя этого я пока не вижу косяков.

А вообще я не понял, что ты от меня хочешь, покойся с миром.

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

От тебя, и от остальных 6 миллиардов мне хотелось бы простого, но невыполнимого — адекватности.
Ты сам начал игру «А если. », я её поддержал, ты слился, т.е. я тебя сделал в твоей же собственной игре, ну куда это годится?
Я надеялся на выходе будет интересное красивое решение, а оказалась скукотища.
Больше с тобой не играем, и при встрече делаем вид, что мы не знакомы

Я от тебя конструктив то услышу? На косяк твоего $() тебе уже не только я указал

для 4гигабайт есть split -l

Не сдаёшься? Респект от Снупа
Для каждой задачи есть свой инструмент.
Не бывает универсальных инструментов, это ты и сам уже понял, и признал. Молодец.
Осталось научить тебя вежливости, и станешь на человека похож.
А твои аргументы из серии
«А знаешь какой у твоего туловища косяк?
У него всего две руки.
Было бы шесть — мог бы печатать в 3 раза быстрее» конечно умиляют, пойду твои остальные каменты почитаю повнимательнее

Смешно от тебя слышать что-то про адекватность, честно

Источник

Показать имена всех файлов в директории Bash Script

Введение

Перед тем как читать эту статью убедитесь, что вы знакомы с содержанием статьи «Основы Bash»

Показать имена всех файлов в директории

#!/bin/bash for file in ./**; do echo » $ » done

Показать файлы с определёныым расширением

Если нужны только файлы с расширением .jpg

#!/bin/bash for file in ./**.jpg; do echo » $ » done

Получить имя файла без расширения

Если нужно только имя файла без расширения

#!/bin/bash for file in ./**.jpg; do filename= » $ » echo $filename done

Получить только расширение файла

Если нужно только расширение

#!/bin/bash for file in ./**.jpg; do extension=»$» echo $EXT ension done

Преобразовать изображения в формат .webp

wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.2.0-linux-x86-64.tar.gz
mkdir webp
cp libwebp-1.2.0-linux-x86-64.tar.gz webp/
tar -xvf libwebp-1.2.0-linux-x86-64.tar.gz
cp -r libwebp-1.2.0-linux-x86-64 libwebp-current
cd libwep-current/bin
pwd
vi

#!/bin/bash for file in ./**.jpg; do filename= » $ » newfile= $filename «.webp» cwebp -q 60 $file -o $newfile done

Добавить к названиям файлов суффикс

Если нужно сохранить расширение файла, а к оригинальному названию добавить какое-то слово или символ. А сделать это со всеми файлами данного типа в директории

Например в директории есть файлы a.jpg , b.jpg , c.jpg , а нужно сделать из них a—small.jpg , b—small.jpg , c—small.jpg

#!/bin/bash POSTFIX=»—small» # что вы хотите добавить EXT=».jpg» # к каким файлам for file in ./** $EXT ; do fullname= » $ » filename= » $ » temp= $filename $POSTFIX mv $file $$EXT done

А теперь скрипт, который делает и то и другое, а перед тем как делать проверяет нет ли уже такого файла

Читайте также:  Сочетание клавиш для открытия поиска windows

Источник

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

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

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

Циклы for

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

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

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

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

Читайте также:  Windows session manager subsystem

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

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

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

Источник

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