07. Создание и копирование файлов

Чтобы научиться работать с файлами, нам понадобятся тестовые файлы. Их мы можем создать с помощью команды touch filename. Вообще, основная задача touch – обновить время доступа к файлу, поэтому и такое название – потрогать. Если файл существует, применив touch на него ничего с ним не случится, только обновится информация в иноде, а если файла не существует – он создастся.

touch file

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

С помощью touch можно разом создать несколько файлов:

touch file1 file2 file3

Одна из фишек командной строки – возможность работать с регулярными выражениями. Например, мы можем написать:

touch file{5..15}

и баш преобразит это в:

touch file5 file6 file7 ...

и т.д., в итоге мы получим кучу файлов. Тоже самое работает и с буквами, допустим, тот же:

mkdir dir_{a..f}

Но о регулярных выражениях мы еще поговорим.

Также можно создавать невидимые файлы и директории. Для этого в начале имени файла или директории следует указывать точку. Например:

touch .file20
mkdir .dir_h

Если посмотреть на вывод ls, скрытых файлов и директорий не увидеть. Чтобы их увидеть, для ls нужен ключ -a:

ls -a

Тогда мы увидим все файлы в директории. Для того, чтобы увидеть скрытые файлы в файловом менеджере, можно нажать Ctrl + h. Тоже самое, чтобы скрыть. Обычно скрытые файлы нужны всяким программам для хранения настроек в домашней директории пользователя, но не только. В целом это позволяет скрыть ненужные пользователю файлы и директории.

И так, что можно делать с файлами? Начнём с копирования. Для этого используется команда cp – copy. Чтобы скопировать файл в текущую директорию, используем cp имя нужного файла и имя для копии:

cp file newfile

Команда что-то сделала, а чтобы увидеть, что произошло, нужно посмотреть (ls). Многие команды сами могут показывать, что происходит во время работы. Обычно для этого используется опция verbose (подробно) - вы часто будете натыкаться на эту опцию. Обычно она пишется как -v. То есть:

cp -v file1 newfile1

Тут мы видим, что файл скопировался.

Чтобы скопировать файл в директорию, используем:

cp -v file dir_a/newfile

Но вообще, если копировать в другую директорию, то необязательно указывать новое имя, можно просто написать:

cp -v file dir_a

Можно копировать из одной директории в другую:

cp -v dir_a/file dir_b/fileb

либо также не указывая нового имени:

cp -v dir_a/file dir_b

Ещё можно копировать из другой директории в текущую, используя ссылку для текущей директории – точку, как я говорил в прошлый раз. То есть:

cp -v dir_b/fileb .

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

cp -v dir_b/fileb filea

В общем, идея какая – для текущей директории путь не нужен, но нельзя просто написать:

cp dir_b/fileb

потому что синтаксис требует указать, куда файл нужно копировать. Если это не сделать, команда подумает, что недописана и просто выдаст ошибку. Ну и до этого мы использовали относительные пути, а так мы можем работать и с полными путями, например:

cp -v /home/user/test/file8  ~/temp/dir_c

Копирование скрытых файлов ничем не отличается от копирования обычных файлов – просто не забывайте указывать точку в начале названия файла, потому что это часть названия файла:

cp -v .file20 dir_c

Можно копировать несколько файлов разом, но тогда нужно копировать их в другую директорию:

cp -v file6 file7 file8 dir_d

Ну и по той же логике, указывая пути:

cp -v dir_a/file dir_b/fileb dir_d/file8 dir_e

Помните про регулярные выражения? Можем использовать и здесь. Допустим:

cp -v file{10..13} dir_e

Кроме фигурных скобок, можно использовать и звёздочку – её часто называют wildcard – она означает, что подойдёт любое значение. Допустим, в директории dir_d есть три файла и я хочу скопировать все три:

cp -v dir_d/* dir_f

Тогда все файлы скопируются. Или, допустим, я хочу скопировать все файлы, названия которых начинаются с file1, а сюда подходят файл file1, file10, file11, file12 и т.д. Я пишу cp -v file1* dir_e и все подходящие файлы скопируются.

Давайте рассмотрим ещё пару ключей. Допустим, ключ -i – интерактивно. Что это значит? Когда вы копируете файл, если существует файл с таким названием в директории назначения, этот файл просто перезапишется. Это не всегда нас устраивает, иногда мы хотим лично решать, что перезаписывать, а что нет. Поэтому здесь нам поможет ключ -i. Допустим, cкопируем все файлы в директорию dir_d:

cp -i file* dir_d

Командная строка начнёт спрашивать, а что же делать с файлами, которые существуют там с тем же именем. Мы можем отказаться от перезаписывания файла, либо согласится. Обычно когда какая-то команда спрашивает вопрос, на который нужно ответить да/нет, то подходят ответы y, либо yes, n, либо no. Такой вариант – интерактивный - требует, чтобы вы лично сидели и решали, что делать с каждым совпадающим файлом.

Кстати, ключи можно использовать вместе. Допустим, мы знаем ключ -v и ключ -i. Мы можем использовать их вместе:

cp -v -i file newfile
cp -iv file newfile
cp -vi file newfile

Порядок – какой ключ вначале, какой потом – почти никогда не имеет значения.

Другой вариант – мы не хотим перезаписывать файлы – тогда сразу используем опцию -n. Например:

cp -vn file* dir_d

Тогда файлы в директории не перезапишутся. А если, допустим, мы хотим пропустить совпадающие файлы, а скопировать только файлы новее или отсутствующие файлы – тогда опция -u – update. То есть:

cp -vu file1* dir_e.

Помните про жёсткие ссылки? Мы можем вместо копирования создать жёсткую ссылку. Например:

cp -vl file filelink

Также мы можем копировать директории. Для этого используем опцию -r – рекурсивно. Допустим, я хочу скопировать директорию dir_a в директорию dir_b:

cp -vr dir_a dir_b

Эту опцию можно использовать не только с директориями, но и с файлами, никому от этого хуже не станет. Забегая вперёд, скажу, что в большинстве случаев правильнее копировать с опцией -a вместо -r, по сути -a это опции -r и -d. Вкратце, это позволяет сохранить права и владельца файла у копии файла.

cp -va dir_a dir_b

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