- Работа с файлами и каталогами в командной оболочке Bash
- Сейчас читают:
- Работа с файлами и каталогами
- Команды для каталогов
- Список основных команд
- Команды для файлов
- Список основных команд
- Перенаправление данных
- Генерация имён файлов в Bash
- Как мне перебрать только каталоги в bash?
- Перечисление только каталогов, использующих ls в bash: экспертиза
- 22 ответов:
- четыре способа сделать это, каждый с другим форматом вывода
- 1. Используя echo
- 2. Используя ls только
- 3. Используя ls и grep
- 4. Сценарий Bash (не рекомендуется для имени файла содержать пробел.)
- 4 (больше) надежных варианта.
- 1.- эхо.
- 4.- Функция
Работа с файлами и каталогами в командной оболочке 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 » в файл, а не на экран:
Новый файл создаётся автоматически. В случае существования элемента с таким же наименованием, произойдёт перезапись. Чтобы этого избежать, необходимо использовать « >> ». Тогда данные будут дописываться в документ.
Пример ввода, при котором информация выносится из файла с помощью команды « sort »:
Генерация имён файлов в Bash
Иногда пользователю приходится работать с несколькими файлами одновременно, например, при выполнении переноса документов в другой каталог. Это станет проблемой, если элементов десятки или сотни и среди них нужно отобрать определённые.
Для решения поставленной задачи можно попробовать использование шаблонного выражения, позволяющего Bash определить необходимые элементы, ориентируясь по наименованию. Этот способ упрощает управление группой файлов путём применения короткой формулировки в команде.
Итак, теперь остаётся разобраться с вопросом составления шаблонов. Сейчас будут приведены основные конструкции для осуществления генерации имён. Чаще всего для отбора файлов применяется символ: « * ». В случае использования этого знака в чистом виде, Bash выберет все элементы в каталоге без исключений.
Для примера, чтобы из этого каталога отобрать файлы: file1, file2, file3, следует воспользоваться шаблоном:
Символ звёздочки позволяет командному интерпретатору выделить все файлы, начинающиеся с «file». При этом последующая часть наименования будет проигнорирована.
Знак « * » можно использовать также в начале или с обеих сторон шаблона.
Кроме того, сгенерировать имена можно, взяв за основу расширение файла. Например:
Начни экономить на хостинге сейчас — 14 дней бесплатно!
Источник
Как мне перебрать только каталоги в bash?
У меня есть папка с некоторыми каталогами и некоторыми файлами (некоторые скрыты, начиная с точки).
будет перебирать все файлы, но я хочу зацикливать только через каталоги. Как мне это сделать?
Вы можете указать косую черту в конце, чтобы соответствовать только каталогам:
Вы можете проверить с -d :
Помните, что решение choroba, хотя и элегантное, может вызвать неожиданное поведение, если в текущем каталоге нет доступных каталогов. В этом состоянии, вместо пропуска for цикла, bash запустит цикл ровно один раз, где d равно */ :
Я рекомендую использовать следующее для защиты от этого случая:
Этот код будет перебирать все файлы в текущем каталоге, проверять, f является ли каталог каталогом, а затем выводить эхо, f если условие возвращает true. Если f равно */ , echo $f не будет выполняться.
Если вам нужно выбрать более конкретные файлы, чем использовать только каталоги find и передать их while read :
Используется shopt -u dotglob для исключения скрытых каталогов (или setopt dotglob / unsetopt dotglob в zsh).
IFS= чтобы избежать разделения имен файлов, содержащих одно из $IFS , например: ‘a b’
см. ответ AsymLabs ниже для большего количества find вариантов
edit:
Если вам нужно создать выходное значение из цикла while, вы можете обойти дополнительный подоболочек с помощью этого трюка:
Вы можете использовать чистый bash для этого, но лучше использовать find:
(найти дополнительно будет включать скрытые каталоги)
Это делается для поиска как видимых, так и скрытых каталогов в текущем рабочем каталоге, исключая корневой каталог:
просто перебрать каталоги:
включить символические ссылки в результат:
сделать что-то для каждого каталога (исключая символические ссылки):
чтобы исключить скрытые каталоги:
выполнить несколько команд для возвращаемых значений (очень надуманный пример):
вместо sh -c также можно использовать bash -c и т. д.
Источник
Перечисление только каталогов, использующих ls в bash: экспертиза
эта команда перечисляет каталоги в текущем пути: ls -d */
что именно делает шаблон */ сделать?
и как мы можем дать абсолютный путь в команды (например, ls -d /home/alice/Documents ) для перечисления только каталогов в этом пути?
22 ответов:
*/ — это шаблон, который соответствует всем подкаталогам в текущем каталоге ( * будет соответствовать все файлы и подкаталоги; the / ограничивает его в каталогах). Аналогично, чтобы перечислить все подкаталоги в разделе/home/alice / Documents, используйте ls -d /home/alice/Documents/*/
четыре способа сделать это, каждый с другим форматом вывода
1. Используя echo
пример: echo */ , echo */*/
Вот что я получил:
2. Используя ls только
пример: ls -d */
Вот именно то, что я получил:
или список (с подробной информацией): ls -dl */
3. Используя ls и grep
пример: ls -l | grep «^d» Вот что я получил:
4. Сценарий Bash (не рекомендуется для имени файла содержать пробел.)
пример: for i in $(ls -d */); do echo $; done
Вот что я получил:
если вы хотите иметь ‘/’ в качестве конечного символа, команда будет: for i in $(ls -d */); do echo $; done
это создает один столбец без конечной косой черты-полезно в скриптах.
4 (больше) надежных варианта.
An без кавычек звездочка * будет интерпретироваться как шаблон (glob) оболочкой.
оболочка будет использовать его в расширении пути.
он будет генерировать список имен файлов, которые соответствуют шаблону.
простая звездочка будет соответствовать всем именам файлов в PWD (настоящий рабочий каталог).
более сложная картина, как */ будет соответствовать все имена, которые заканчиваются на / .
таким образом, все справочники. Вот почему команда:
1.- эхо.
будет расширен (оболочкой) до echo все каталоги в PWD.
чтобы проверить это: создайте каталог ( mkdir ) названный как test-dir, и cd в:
создать несколько каталогов:
команда echo ./*/ останется надежным даже с нечетными именованными файлами:
но пробелы в именах файлов делают чтение немного запутанным.
если вместо echo , мы используем ls , оболочка по-прежнему, что расширяет список имен файлов. Оболочка является причиной для получения списка каталогов в PWD. Элемент до ls делает его список текущей записи каталога вместо содержимого каждого каталога (как представлено по умолчанию).
однако, эта команда (несколько) менее надежны. Он потерпит неудачу с нечетным именованные файлы, перечисленные выше. Он задохнется от нескольких имен. Вам нужно стереть один за другим, пока вы не найдете те, с проблемами.
GNU ls примет «конец настройки» ( — ключ).
чтобы перечислить каждый каталог в отдельной строке (в одном столбце, аналогично ls -1), используйте:
и, еще лучше, мы могли бы удалить трейлинг / :
An попытка такая:
- некоторые имена ( ls -d */ ) как уже было показано выше.
- будет зависеть от значения IFS .
- разделит имена на пробелы и вкладки (по умолчанию IFS ).
- каждая новая строка в имени будет запускать новую команду echo.
4.- Функция
наконец, использование списка аргументов внутри функции не повлияет на аргументы список текущей запущенной оболочки. Просто:
представляет этот список:
эти параметры безопасны с несколькими типами нечетных имен файлов.
The tree команда также очень полезна здесь. По умолчанию он будет показывать все файлы и каталоги на полную глубину, с некоторыми символами ASCII показывает дерево каталогов.
но если бы мы хотели получить только каталоги, без дерева ascii, и с полным путем из текущего каталога, вы могли бы сделать:
и если вам нужен абсолютный путь, вы можете начать с указания полный путь к текущему каталогу:
и ограничить количество подкаталогов, вы можете установить максимальный уровень подкаталогов с -L level , например:
больше аргументов можно увидеть с человек-дерево
Если вам интересно, почему вывод из ‘ ls-d */’ дает вам два косые черты, например:
Это, вероятно, потому, что где-то ваши файлы конфигурации оболочки или сеанса псевдоним команды ls для версии ls, которая включает флаг-F. Этот флаг добавляет символ к каждому выходному имени (это не простой файл), указывающий на то, что это такое. Таким образом, одна косая черта-это от соответствия шаблону’*/’, а другая косая черта-это добавленный тип указатель.
чтобы избавиться от этой проблемы, вы можете, конечно, определить другой псевдоним для ls. Однако, чтобы временно не вызывать псевдоним, вы можете добавить команду с обратной косой чертой:
Я просто добавляю это к моему .bashrc файл (вы также можете просто ввести его в командной строке, если вам нужно / нужно только для одного сеанса)
тогда ЛСД даст желаемый результат.
если скрытый каталог не нужно перечислять, я предлагаю:
и если скрытые каталоги необходимо перечислить, используйте:
Источник