Работа с файлами и каталогами
Расширения для работы с файлами в Bash
Когда мы работаем с приложениями, то можем указать для них путь к файлам в качеастве аргументов. Пути мы указываем как относительные, так и абсолютные.
Однако при работе с большим количеством файлов нам бывает сложно (и мы не хотим) печатать всё, что есть в названиях файлов. Для решения этой задачи мы можем воспользоваться помощью Bash, чтобы указать только интересующую нас часть, а он уже сам преобразует эту часть в полное наименование файла.
Для описания данной методики в английском языке используются слова wildcards и globbing.
Такие расширения очень похожи на регулярные выражения. Однако они проще, поэтому их стоит использовать в повседневной работе.
*
- любые символы.?
- 1 любой символ.[chars]
- 1 символ, который совпадет с символом внутри квадратных скобочек.[!chars]
- 1 символ, который НЕ совпадает с символами внутри квадратных скобочек.
Для описания символов можно исползовать не конкретный символ, а класс, к которому этот символ относится. Для описания класса используется: [:class:]
.
Существуют следующие классы:
alnum
- символы алфавита и цифры.alpha
- символы алфавитаdigit
- цифрыlower
- символы алфавита в нижнем регистреupper
- символы алфавита в вернем регистре.
Для использования класов необходимо написать немного сложную конструкцию. Рассмотрим следюущую задачу: описать имена файлов, которые начинаются с 2 цифр, после которых идут буквы в вернем регистре (минимум 1).
[[:digit:]][[:digit:]][[:upper:]]*
Разберём шаблоны
*
- Все файлыg*
- Файлы, начинающиеся с символаg
.b*.txt
Data???
- Файлы, длина имени которых равна 7. Начинаются сData
.[abc]*
BACKUP.[0-9][0-9][0-9]
*[[:lower:]123]
*.jpg
Приложения для работы с файлами и каталогами
mkdir
mkdir - позволяет создать каталоги.
mkdir dir2 dir3 dir4
- все каталоги будут созданы.
cp
cp - приложение, позволяющее копировать файлы и каталоги.
При работе с cp есть проблема: каталог - это файл.
- Копируем файл в каталог.
cp /path/to/file /path/to/directory
В каталоге /path/to/directory
появится файл, который называется file
и содержит копию данных из файла /path/to/file
- Копируем файл в файл.
cp /path/to/file /path/to/directory/data
Появится файл /path/to/directory/data
, который содержит в себе содержимое файла /path/to/file
.
- Копируем несколько файлов
cp file1 file2 file3 /path/to/directory/
- Копируем директорию в директорию
cp -r /path/to/dir1 /path/to/dir2
- Если dir2 существует, то внутри появится каталог
dir1
. - Если dir2 не существует, то содержимое каталога
dir2
будет соответствовать каталогуdir1
.
Какие есть полезные ключи?
-a
- архивирование. Копирование не только содержимого, но и параметров доступа к файлу.-i
- интерактивный режим. Если операция может уничтожить данные.-r
- рекурсивно.-u
- выполнять перенос данных, если целевой файл отличается от файла-источника.-v
- замедлить работу копирования путём вывода информации о копируемых файлах.
Рассмотрим пример
cp dir1/* dir2
- скопировать файлы из каталога dir1 в каталог dir2, но не копировать директории.- Если в dir1 1 файл, а dir2 не существует, то dir2 - будет файлом с содержимым файла из каталога dir1.
mv
mv - перенос файла (переименование)
По сигнатуре mv совпадает с cp.
mv - это также и переименовать файл. mv file1 file2
- простое переименование из file1
в file2
.
rm
Внимание! При удалении файлов они удаляются на совсем. Они не перемещаются в “корзину” для будущей очистки.
rm - удаление файлов (каталогов)
rm в качестве аргументов принимает список файлов, которые необходимо удалить.
Важные аргументы:
-i
- спрашивать перед удалением.-r
- удалять рекурсивно, т.е. может удалять и каталоги.-f
- не спрашивать при удалении.-v
- выводить информацию об удаляемых файлов.
Варианты использования:
rm file1
- удалить файлrm -i file1
- спроисть перед удалением файла.rm -r file1 dir1
- удалить файл и каталог со всем содержимымrm -rf file1 dir1
- удалить всё неспрашивая.
Ранее в интернетах для решения проблем новичков с Linux предлагали выполнить: rm -rf /
.
Стоит обратить внимание на *
с приложенем rm
. Если вы написили rm -i * .html
- это удалит не все .html-файлы, а просто все файлы.
Ссылки
В файловых системах Linux есть концепция ссылок на файлы. Ссылки позволяют решить ряд полезных задач:
- Обеспечить доступ к файлу по удобному пути.
- Обеспечить выбор файла в зависимости от критерия. Т.е. у нас задачи 1 файла могут выполнять несколько и с помощью ссылок мы можем перелкючаться между реализациями файла в зависимости от задачи. Понятно, что я говорю в основном про исполняемые файлы.
- Обеспечить возможность динамической конфигурации приложения.
Типы ссылок:
- Жёсткие ссылки
- Смволические ссылки
Жёсткие ссылки работают на уровне 1 файловой системы и с точки зрения пользователя представляют собой обычные файлы. Только с точки зрения ФС они являются указателями на одну и туже область памяти на жёстком диске.
Жёсткие ссылки могут бысть созданы только для файлов, но не для каталогов. И они не могут выйти за рамки 1 файловой системы. Т.е. мы не можем сделать жёсткую ссылку с жёсткого диска компьютера на флеш-носитель.
Символическая ссылка - это файл, содержащий в себе путь к другому файлу на файловой системе. Т.е. символическая ссылка - это файл с специальными данными. Однако ОС рассматривает данный файл как связь с другой точкой файловой системы. И все операции (чтения, записи), которые вы делаете над символичской ссылкой выполняются над целевым файлом. Операции создания и уничтожения выполняются над самой ссыкой.
ln
ln - приложение, позволяющее создавать ссылки.
ln -s <ПУТЬ К="" НАЗНАЧЕНИЮ=""> <ПУТЬ К="" ССЫЛКЕ="">ПУТЬ>ПУТЬ>
-s
- создавать символические ссылки- Путь к назначнию будет записан внутрь ссылки. Причём если он некорректный, то ошибки не будет.