- Копирование файлов в Linux
- Утилита копирования файлов cp
- Синтаксис и опции
- Примеры копирования файлов в linux
- Копирование файлов по регулярным выражениям в Linux
- Копирование содержимого файлов в Linux
- Специальное копирование файлов в Linux с помощью tar
- Выводы
- Примеры команды cat
- Отображать содержимое файла
- Создание нового файла
- Копируем содержимое файла
- Объединяем содержимое множества файлов
- Отображаем номера строк
- Объединение содержимого файла со стандартным вводом
- Не показывать повторяющиеся пустые строки в выводе
- Отобразить конец строки и символы табуляции
Копирование файлов в Linux
Копирование файлов — одна из задач, наиболее часто возникающих перед пользователями персонального компьютера. Конечно, можно открыть файловый менеджер, войти в нужную папку и скопировать файл с помощью контекстного меню — тут не о чем говорить. Но в этой статье я хотел бы рассмотреть копирование файлов в Linux с помощью терминала.
Не всегда есть доступ к файловому менеджеру: из-за различных поломок графическая оболочка на домашнем компьютере может быть недоступна, а на серверах используется только консольный интерфейс. К тому же копирование файлов Ubuntu через терминал намного эффективнее, и вы сами в этом убедитесь. Сегодня мы рассмотрим не только обычное копирование командой cp Linux, но и не совсем обычное: с помощью tar и find.
Утилита копирования файлов cp
Название утилиты cp — это сокращение от Copy, что означает копировать. Утилита позволяет полностью копировать файлы и директории.
Синтаксис и опции
Общий синтаксис cp выглядит вот так:
$ cp опции файл-источник файл-приемник
$ cp опции файл-источник директория-приемник/
После выполнения команды файл-источник будет полностью перенесен в файл-приемник. Если в конце указан слэш, файл будет записан в заданную директорию с оригинальным именем.
Утилита имеет несколько интересных опций, которые могут сильно помочь при нестандартных задачах копирования, поэтому давайте их рассмотрим:
- —attributes-only — не копировать содержимое файла, а только флаги доступа и владельца;
- -f, —force — перезаписывать существующие файлы;
- -i, —interactive — спрашивать, нужно ли перезаписывать существующие файлы;
- -L — копировать не символические ссылки, а то, на что они указывают;
- -n — не перезаписывать существующие файлы;
- -P — не следовать символическим ссылкам;
- -r — копировать папку Linux рекурсивно;
- -s — не выполнять копирование файлов в Linux, а создавать символические ссылки;
- -u — скопировать файл, только если он был изменён;
- -x — не выходить за пределы этой файловой системы;
- -p — сохранять владельца, временные метки и флаги доступа при копировании;
- -t — считать файл-приемник директорией и копировать файл-источник в эту директорию.
Примеры копирования файлов в linux
Теперь, когда вы знаете основные опции, можно перейти к практике. Например, мы хотим скопировать некую картинку из домашней папки в подкаталог pictures:
Или можем явно указать имя новой картинки:
# cp ~/pic.png ~/pictures/wallpaper.png
Копирование папок осуществляется с помощью ключа -r:
После выполнения этой команды копирования ~/папка будет скопирована в папку ~/Документы. Главное, не забывайте поставить слэш в конце выражения или использовать опцию -t. Иначе папка ~/документы будет перезаписана.
По умолчанию команда cp Linux перезаписывает существующие файлы или папки, но можно заставить утилиту спрашивать, нужно ли перезаписывать каждый файл, если вы не уверены в правильности составления команды:
Есть и противоположная опция -n, означающая «никогда не перезаписывать существующие файлы».
Опция -u полезна в следующем случае: вы знаете или предполагаете, что в директории, куда копируется файл, есть старая его версия, тогда оператор -u выполнит замену на новую версию:
Сp также поддерживает специальные символы замены * и ?. Например, следующая команда скопирует все файлы, начинающиеся на test:
Если нужно применить более сложные регулярные выражения, придётся комбинировать утилиту cp с find или egrep.
В случае, если важно сохранить права доступа к файлу и его владельца, нужно использовать опцию -p:
Для упрощения использования команды можно применять синтаксис фигурных скобок. Например, чтобы создать резервную копию файла, выполните:
Будет создан файл с таким же именем и расширением .bak
По умолчанию в cp не отображается прогресс копирования файла, что очень неудобно при работе с большими файлами, но его можно легко посмотреть с помощью утилиты cv.
Копирование файлов по регулярным выражениям в Linux
В утилите find можно применять различные условия и регулярные выражения для поиска файлов. Я уже немного писал о ней в статье как найти новые файлы в Linux. Мы можем скопировать все найденные с помощью find файлы, вызвав для каждого из них команду cp. Например, копируем все файлы в текущей директории, содержащие в имени только цифры:
# find . -name 6 -exec cp <> ~/Документы \
Здесь точка указывает на текущую директорию, а параметр name задает регулярное выражение. Параметром exec мы задаем, какую команду нужно выполнить для обнаруженных файлов. Символ <> — подставляет имя каждого файла.
Но не find‘ом единым такое делается. То же самое можно получить, запросив список файлов директории в ls, отфильтровав его по регулярному выражению egrep и передав имена файлов по очереди в cp с помощью xargs:
# ls -1 ~/ | egrep '[a-zA-Z]' | xargs cp -t ~/Папка/
Это не совсем удобный способ копировать файлы Linux, но всё же он возможен. Будут скопированы все файлы из домашней директории, содержащие в имени только английские буквы.
Копирование содержимого файлов в Linux
Вы можете не только копировать сами файлы, но и управлять их содержимым. Например, склеить несколько файлов в один или разрезать файл на несколько частей. Утилита cat используется для вывода содержимого файла, в комбинации с операторами перенаправления вывода Bash вы можете выполнять копирование содержимого файла Linux в другой файл. Например:
Если файл был не пустым, он будет перезаписан. Или мы можем склеить два отдельных файла в один:
Специальное копирование файлов в Linux с помощью tar
Linux интересен тем, что позволяет выполнять одно и то же действие различными путями. Копирование в Linux тоже может быть выполнено не только с помощью cp. При переносе системных файлов в другой каталог, резервном копировании системных файлов и т.д. важно чтобы сохранились атрибуты, значения владельцев файлов и символические ссылки как они есть без какой-либо модификации.
Утилита cp тоже может справиться с такой задачей? если указать опцию -p, но можно использовать утилиту архивации tar. Мы не будем создавать никаких файлов архивов, а построим туннель. Первая часть команды пакует файл и отправляет на стандартный вывод, а другая сразу же распаковывает в нужную папку:
# tar cf - /var | ( cd /mnt/var && tar xvf - )
Здесь мы полностью копируем содержимое папки /var в папку /mnt/var. Так вы можете копировать папку Linux, причём абсолютно любую или даже целую операционную систему.
Выводы
Теперь вы знаете, как выполняется копирование файлов Ubuntu и в Linux в целом. Как видите, в терминале это выполняется намного быстрее и эффективнее, чем с помощью графического интерфейса, если помнить нужные команды. Если у вас остались вопросы, спрашивайте в комментариях!
Примеры команды cat
Команда cat – это одна из базовых команд, которые вы изучили когда пришли в мир Unix / Linux. Что ещё эта команда может делать?
Отображать содержимое файла
Когда вы вводите в качестве аргумента имя файла в cat, она отображает содержимое этого файла.
Вы также можете отобразить содержимое более чем одного файла.
Создание нового файла
Используя команду cat, строки, полученные из стандартного ввода, могут быть перенаправлены в новый файл используя символ редиректа. Когда вы набрали просто команду cat без каких либо аргументов, она примет содержание стандартного ввода и отобразит его в стандартном выводе.
(Для остановки нажмите Ctrl+d)
Вы также можете перенаправить стандартный вывод в новый файл как показано ниже.
$ cat > file.txt Text for file.txt.
Иногда вам может понадобиться добавить контент к файлу, для этого используйте символ редиректа >> как показано ниже.
Копируем содержимое файла
Символ редиректа играет важную роль в unix при обработке стандартных файловых дискрипторов содержимого. Используя его вы можете скопировать содержимое одного файла в другой, как показано ниже.
Объединяем содержимое множества файлов
Через команду cat вы можете объединить содержимое более чем одного файла в один файл.
Например, из файлов file.txt и file2.txt объединяем в новый файл all_pgrm.pl.
$ cat file.txt file2.txt > file3.txt
Отображаем номера строк
Для отображения содержимого файла с номерами строк перед каждой строкой, используйте опцию -n.
Обратите внимание, что строки, которые содержат белые пробелы, не рассматриваются как пустые строки.
Объединение содержимого файла со стандартным вводом
Существует возможность читать строки из стандартного ввода, и также и объединять их с другими файлами. Следовательно, пользователь может печатать его собственный контент, который ему нужен.
В следующем примере вы можете вставить несколько строк (из стандартного ввода) в начало и при этом скомбинировать вместе файлы.
$ cat - file.txt file2.txt > file3.txt Contents from file : file.txt, file2.txt
Не показывать повторяющиеся пустые строки в выводе
Иногда файл может содержать повторяющиеся пустые строки, которые вы не хотите отображать в стандартном выводе. Команда cat предоставляет опцию -s, которая подавит последовательные пустые строки в выводе.
Отобразить конец строки и символы табуляции
Вы можете сделать так, что cat будет отображать символ $ в конце каждой строки. Обычно, считывая файл, пользователи могут найти белые пробелы в конце каждой строки, используя опцию -e.
Используйте опцию -T для отображения символов табуляции. Она отобразит ^I для символов табуляции.
Считывать содержимое до заданного образца
Когда вы считываете из стандартного ввода, вы можете задать прекратить чтение, когда строка будет содержать заданный образец.
$ cat line one > line two > EOF line one line two