Найти тему

Командная строка Linux, работа с файлами: команды touch, mkdir, cp, mv, rm

Оглавление
Командная строка Linux. Часть 4
Командная строка Linux. Часть 4

Приветствую!

Это четвертый пост из цикла, посвященного работе в командной строке Linux. Сегодня мы рассмотрим команды по работе с файлами в Linux: touch, mkdir, cp, mv, rm.

Если вы только начинаете изучать Linux, то настоятельно рекомендую посмотреть предыдущие посты:

Практические примеры из постов данного цикла выполнялись в среде дистрибутива Linux Mint 21.

Присоединяйтесь к нашему каналу: t.me/r4ven_me и чату: t.me/r4ven_me_chat в Telegram.

Список команд

Ну а сегодня наш арсенал инструментов пополнится, вероятно, самыми популярными командами (не считая ls и cat) в Linux:

  • touch- создаёт простые файлы
  • mkdir - создает каталог/и
  • cp - копирует файлы и каталоги
  • mv - перемещает/переименовывает файлы и каталоги
  • rm - удаляет файлы и каталоги

Команда touch – создание простых файлов

Синтаксис:

touch [ключи] <имя_файла>

С этой командой мы уже немного знакомы из прошлого поста. Сегодня мы рассмотрим её подробнее.

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

Часто используемые ключи:

КлючЗначение-aдля установки только времени доступа (atime) файла-mдля установки только времени изменения (mtime) файла-cдля создания файла, только если он не существует

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

1. Создание нового файла:

touch text_file.txt

Мы создали пустой файл. Выполним ls для проверки:

-2

2. Обновление времени доступа и времени изменения файла:

ls -l text_file.txt

touch text_file.txt

ls -l text_file.txt
-3

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

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

touch -t 202301011200 time_text_file.txt

ls -l time_text_file.txt
-4

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

Для получения более подробной информации о команде touch можно обратиться к официальной документации или воспользоваться командой man touch в терминале Linux.

Команда mkdir (make directory) – создание каталогов

Синтаксис:

mkdir [ключи] <имя_каталога>

Часто используемые ключи:

  • –p - создаёт родительские каталоги при необходимости
  • –v - выводит сообщение о каждой выполненной операции
  • –m - устанавливает права доступа к файлу (как в chmod)

Давайте создадим директорию для тестов, затем убедимся в её существовании командой ls и выполним в неё переход с помощью cd. Затем проверим текущий рабочий каталог командой pwd. Выполняем в терминале поочередно четыре команды:

mkdir testdir
ls
cd testdir
pwd
-5

Если вы не знакомы указанными командами, то пожалуйста прочитайте мои предыдущие посты по командной строке Linux.

Отлично. Теперь давайте создадим еще один каталог внутри текущего, добавив команде ключ -v (verbose) и посмотрим на вывод команды:

mkdir -v testdir2
-6

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

Теперь давайте создадим одной командой несколько вложенных каталогов используя ключ -p (parents):

mkdir -vp testdir3/testdir4
-7

Как видно, команда создала два каталога: testdir3 в текущем каталоге и testdir4 внутри testdir3 с помощью ключа -p.

Если при создании вложенных каталогов не использовать ключ -p команда выдаст ошибку и ничего не создаст.

Как вы обратили внимание по умолчанию, если не указывать адрес создания нового каталога, команда mkdir создает его в текущем рабочем каталоге.

Давайте попробуем создать сразу два каталога где-нибудь в другом месте, например создадим каталоги testdir5 и testdir6 в нашем домашнем каталоге находясь при это в каталоге testdir. Для этого перед именем создаваемого каталога необходимо указать путь к нему:

mkdir -v /home/ivan/testdir5 ~/testdir6
-8

Как видим, мы передали команде mkdir в качестве аргументов два новых каталога с указанием пути к нашей домашней директории используя два разных способа. Затем находясь в каталоге /home/ivan/testdir вывели содержимое родительского каталога указав в качестве аргумента команде ls относительный путь ..

Про ключ -m поговорим в другой раз, когда будем разбираться с правами на файлы в Linux.

Команда cp (copy) – копирование файлов и каталогов

Синтаксис:

cp [ключи] <имя_копируемого_файла> <имя_нового_файла>

Часто используемые ключи:

  • -v - выводит выполняемые действия в стандартный вывод
  • -i - интерактивный режим (спрашивать перед тем, как перезаписать файл)
  • -r - рекурсивно копирует каталоги
  • -p - копирует файл с сохранением его атрибутов (владелец, группа, права)

Для практики скопируем созданный нами текстовый файл text_file.txt в директорию testdir, предварительно вернувшись в домашний каталог:

cd
ls
cp text_file.txt testdir
ls -l testdir
-9

Теперь давайте создадим и скопируем файл text_file2.txt в директорию testdir используя ключ -v:

touch text_file2.txt

cp -v text_file2.txt testdir
-10

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

В качестве аргументов команде cp можно передавать и несколько файлов.

Перейдём в директорию testdir, создадим новую директорию testdir2 и скопируем лежащие в текущей директории файлы text_file.txt и text_file2.txt в testdir2:

cd testdir

ls -l

cp -v text_file.txt text_file2.txt testdir2/
-11

Проверим содержимое каталоге testdir2:

ls -l testdir2
-12

Как видим, мы успешно скопировали файлы.

Теперь попробуем скопировать каталог testdir2:

cp testdir2 testdir2copy

Как, видим мы получили ошибку. Дело в том, что каталоги с помощью команды cp необходимо копировать используя ключ -r. На скриншоте ниже, продемонстрирован пример выполнения команды cp -r после получения ошибки.

cp -r testdir2 testdir2copy
-13

У данной команды есть одна особенность, о которой нужно всегда помнить. По умолчанию, при копировании файлов/каталогов с помощью cp, если копировать файлы с именем уже существующих файлов, происходит их перезапись! Т.е. существующий файл удаляется, а на его место встанет создаваемая копия.

Будьте очень осторожны с копированием любых важных файлов.

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

Простой пример. Находясь в директории testdir попробуем скопировать файл text_file.txt в testdir2:

cp -vi text_file.txt testdir2
-14

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

Последним примером посмотрим команду cp с ключом -p который сохраняет исходные атрибуты файла.

Для наглядной демонстрации скопируем файл text_file.txt в текущую директорию от имени root пользователя (введя пароль админа после ввода первой команды), а затем выполним такую же команду с ключом -p:

sudo cp -v text_file.txt root_file.txt

sudo cp -vp text_file.txt root2_file.txt

ls -l
-15

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

Обратите внимание, что также изменились права доступа к файлу, глобально заданные для пользователя root по умолчанию -rw-r--r--.

Но при использовании ключа -p исходные атрибуты сохранились.

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

Команда mv (move) – перемещение/переименование файлов

Синтаксис (переименование):

mv [ключи] <имя_файла> <новое_имя_файла>

Синтаксис (перемещение):

mv [ключи] <путь/имя_файла> <новый_путь/имя_файла>

Часто используемые ключи:

  • -v - выводит выполняемые действия в стандартный вывод
  • -i - интерактивный режим (спрашивать перед тем, как перезаписать)
  • -u - update, перемещает, только если ИСТОЧНИК новее, чем файл назначения

В Linux для переименования и перемещения файлов используется одна и та же команда. Для переименования файла нужно передать в качестве аргументов текущее имя файла и новое имя файла, находясь в той же директории.

Для перемещения необходимо указать текущее имя файла и его новое расположение. Попрактикуемся.

Откроем наш файл text_file.txt в текстовом редакторе и наполним его любым содержимым. Например, я добавлю в него “Hello R4ven.me!!!”

xed text_file.txt

Теперь находясь в директории testdir/ давайте переименуем файл text_file.txt в new_text_file.txt используя ключ -v которые имеет тот же эффект, что и у команды cp:

cat text_file.txt

mv -v text_file.txt new_text_file.txt

ls -l

cat new_text_file.txt
-16

Для убеждения, что это тот же файл, выводим его содержимое с помощью cat.

Ключ -i у команды mv тут также аналогичен ключу команды cp: он вызывает интерактивный режим, в случае если выполняемая вами команда перезапишет файл.

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

Для демонстрации возьмем наш файл new_text_file.txt и скопируем его в директорию testdir2:

cat new_text_file.txt

cp -v new_text_file.txt testdir2
-17

Затем откроем наш файл new_text_file.txt в текущей директории в текстовом редакторе и изменим содержимое на “Bye R4ven.me!!!” с помощью xed:

xed new_text_file.txt
-18

Теперь выполним перенос файла testdir2/new_text_file.txt обратно в нашу текущую директорию testdir используя ключи -u:

mv -ivu testdir2/new_text_file.txt .

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

-19

Как видим, наш текущий файл new_text_file.txt не изменился. Потому что временная метка файла в testdir2/new_text_file.txt новее и при использовании ключа -u перезапись не произошла.

Выполним перемещение наоборот: недавно измененный нами файл new_text_file.txt переместим в testdir2 с теми же ключами:

mv -ivu new_text_file.txt ./testdir2/

cat testdir2/new_text_file.txt
-20

Теперь команда с помощью ключа -u обнаружила, что файл назначения старее перемещаемого, и сработал ключ -i, запрашивающий у нас подтверждения на перезапись файла назначения. Нажимаем y или yes и проверяем содержимое файла, для достоверности.

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

ls -l new_text_file.txt

touch new_text_file.txt

ls -l new_text_file.txt
-21

Команда rm (remove) – удаление файлов и каталогов

Синтаксис (удаление файла):

rm [ключи] <имя_удаляемого_файла>
# или
rm [ключи] </путь/до/удаляемого_файла>

Часто используемые ключи:

-v - выводит выполняемые действия в стандартный вывод

-i - интерактивный режим (спрашивать перед тем, как удалить)

-r - рекурсивно удаляет каталоги и их содержимое

-f - игнорирует несуществующие файлы и аргументы, выполняет удаление ни о чем не спрашивая

Создавать файлы мы с вами научились, теперь поговорим про их удаление.

Пожалуйста, будьте осторожны с командой rm, так как при удалении файлов с её помощью они удаляются из системы навсегда. Данная команда не подразумевает никакой “корзины”, как в Windows. Восстановить удаленные с помощью rm файлы возможно, но не так просто и без каких-либо гарантий. Всегда используйте ключ -i для интерактивного удаления с подтверждением.

И так, находясь в директории ~/testdir удалим существующий там файл text_file2.txt:

ls -l

rm text_file2.txt

ls -l
-22

Как видим файл был удален. Давайте удалим теперь файл testdir2/new_text_file.txt c помощью ключа -v:

rm -v testdir2/new_text_file.txt
-23

Видим подробный вывод.

Ключ -i тут имеет такой же эффект, как и у команд cp и rm:

ls -l

rm -vi root2_file.txt
-24

Для отмены удаления нужно нажать n или no.

Теперь давайте попробуем удалить каталог testdir3:

rm -iv testdir3

Получили ошибку:

-25

Для удаления каталогов обязателен ключ -r. Попробуем с ним:

rm -ivr testdir3
-26

Видим, что работают ключ -i и -v запрашивая у нас подтверждения на выполнения действий и выводе подробную информацию о них.

Чтобы быстро удалить каталог используйте просто -r. Удалим testdir2copy:

rm -r testdir2copy
-27

Теперь про ключ -f (force).

У нас есть файл root_file.txt владельцем которого является root, а права на запись у данного файла у прочих пользователей, в том числе и нас, отсутствуют. Давайте попробуем удалить этот файл:

ls -l

rm -v root_file.txt

Команда предупреждает нас о том, что файл защищен от записи и запрашивает предупреждение. Откажемся удалять этот файл нажатием n и попробуем еще раз только с ключом -f:

rm -vf root_file.txt
-28

Вероятно вы часто видели шутки про команду rm -rf / ни в коем случае не выполняйте её, особенно он имени пользователя root.

С учетом предоставленной выше информации мы теперь понимаем, что она делает:

rm – команда удаления

-rf – рекурсивно удаляет каталоги с их содержимым, игнорируя всякие предупреждения и ошибки

/ – это путь, обозначающий корень нашей системы.

Т.е. данная команда удаляет содержимое всей нашей системы. Большинство современных дистрибутивов добавляют защиту от выполнения этой команды в виде предупреждения или дополнительного ключа, но все же ее возможно выполнить, так, как система полностью принадлежит пользователю, т.е. нам с вами:) и это круто.

К примеру в Linux Mint данная команда не выполнится без определенного ключа:

-29

Послесловие

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

В следующем посте мы поговорим про отдельный тип файлов в Linux – ссылки (линки). Чем хард линки отличаются от сим линков и какие есть преимущества и недостатки у каждого типа.

Полезные источники

Мои ссылки: