Команда копирования Linux: копирование файлов из командной строки

Системы на базе Linux предлагают множество команд оболочки, которые могут помочь пользователям и разработчикам выполнять задачи. Команда копирования (cp) предоставляет удобные средства копирования файлов с использованием командной строки. В этой короткой статье мы обсудим, как скопировать все файлы в каталог в операционной системе на базе Linux.

Краткое введение: функция копирования

Команда Копировать (cp) используется для копирования файлов, групп файлов или даже целых каталогов. С помощью различных опций команду копирования можно использовать для копирования одного или нескольких файлов или каталогов в исходный файл, файлы или каталог. Команда копирования также имеет множество полезных опций. Среди множества дополнительных функций команда копирования позволяет пользователям делать следующее:

  • Создайте резервную копию файла назначения
  • Принудительное копирование в случаях, когда права пользователя ограничены.
  • Рекурсивно копировать все файлы и подкаталоги
  • Сохранять атрибуты исходных файлов при копировании
  • Поддерживает использование подстановочных знаков для спецификаций исходного файла.

Это лишь некоторые из многих опций, доступных с помощью команды копирования. Эта команда может помочь с легкостью выполнять мощные, но фундаментальные действия. В этой статье мы рассмотрим несколько вариантов использования функции копирования: от базового использования до использования некоторых более интересных опций. Во-первых, давайте посмотрим на пример каталога, содержащего несколько файлов и подкаталогов, которые мы можем использовать в качестве «песочницы».

Пример каталога и файлов

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

.
└── copy-examples/
    ├── a.txt
    ├── subdir1/
    │   └── b.txt
    └── subdir2/
        ├── c.txt
        ├── subdir2_subdir1/
        │   └── d.txt
        └── subdir2_subdir2/
            └── e.txt

Основной синтаксис

По мере изучения этой статьи мы будем использовать команду копирования с различными параметрами и аргументами. Однако базовый синтаксис этой команды следующий:

$ cp [source_file] [destination_file]

В данном случае $ означает использование нами оболочки Linux. Этот синтаксис будет немного меняться по мере того, как мы копируем несколько файлов, копируем в каталоги и из них и начинаем добавлять флаги для таких вещей, как сохранение атрибутов файлов. В этой статье команда копирования рассматривается на примерах простого и распространенного использования. Полный список команд и опций можно найти в документации Linux.org.

Скопируйте один файл

Копирование одного файла из источника в место назначения — канонический вариант использования команды копирования Linux. Чтобы скопировать один файл, нужно просто ввести его в оболочку cp, затем указать файл для копирования, а затем имя файла назначения. Запустите из каталога copy-examples, файл a.txt  можно скопировать a-copy.txt следующей командой:

$ cp a.txt a-copy.txt

Ввод команды ls (показать файлы в текущем каталоге) теперь дает следующий вывод: a-copy.txt a.txt subdir1 subdir2 указание на то, что наш файл был успешно скопирован.

Скопируйте файлы в другой каталог

Копирование файла в существующий каталог не всегда желательно. Во многих случаях может потребоваться скопировать файл в другой каталог или скопировать файл из другого каталога. Ниже приведена команда, необходимая для копирования a.txt из текущего каталога в subdir1 каталог:

$ cp a.txt subdir1

Обратите внимание, что на самом деле мы не указали полное имя выходного файла. Команда копирования не требует повторного указания имени файла назначения при условии, что для каталога передается аргумент. Передача .в качестве цели назначения (с указанием текущего каталога) приведет к следующему сообщению об ошибке:

$ cp: 'a.txt' and './a.txt' are the same file

Копирование файлов из другого каталога

Копирование файлов из другого каталога часто является необходимостью для разработчиков и пользователей. Команда копирования Linux позволяет указать каталог, отличный от текущего рабочего каталога, из которого исходный файл можно использовать для копирования в место назначения. Например, давайте скопируем c.txtиз subdir2в корень каталога нашего проекта. Это можно сделать с помощью следующей команды:

$ cp subdir2/c.txt .

Это создаст копию c.txtв нашем текущем рабочем каталоге. Эта команда cp также может копировать данные из другого каталога в другой каталог. Например, давайте создадим еще одну копию файла subdir_2/c.txtи поместим ее в subdir1каталог:

$ cp subdir_2/c.txt subdir1/c.txt

Мы можем подтвердить успех этого действия с помощью команды $ ls subdir1, которая выдает следующий результат:

a.txt b.txt c.txt

Команда копирования не поддерживает создание несуществующих каталогов. Например, $ cp a.txt subdir_3/a.txt выдаст следующее сообщение об ошибке:

cp: cannot create regular file 'subdir_3/a.txt': No such file or directory

Передача флага --parentsможет скопировать существующие файловые структуры из исходного файла в целевой каталог, но не позволяет создавать новые имена каталогов.

Копирование нескольких файлов

Наш subdir1 начал накапливать довольно много файлов. Теперь в этом каталоге у нас есть файлы a.txt, b.txtи. c.txt Копирование каждого из этих файлов вручную потребует ввода трёх отдельных команд cp — а мы все знаем, что программисты слишком ленивы для этого! К счастью, мы можем скопировать все эти файлы с помощью следующей команды:

$ cp subdir1/a.txt subdir1/b.txt subdir1/c.txt subdir2/subdir2_subdir1

Выполнение ls команды в subdir2/subdir2_subdir1 каталоге дает нам понять, что все идет по нашему плану. Это работает, но синтаксис начинает становиться неуклюжим. К счастью, есть несколько подходов, которые могут помочь упростить наш синтаксис. Первый — использовать подстановочные знаки:

$ cp subdir2/subdir2_subdir1/*.txt subdir2/subdir2_subdir2

Это дает команду программе копирования скопировать все файлы, заканчивающиеся на, из .txt каталога subdir2/subdir2_subdir1, в который мы только что скопировали несколько файлов, в subdir2/subdir2_subdir2 каталог, в котором единственным существующим файлом был e.txt. Опять же, запуск ls команды может подтвердить наш успех.

Копирование каталога

Команда копирования также поддерживает копирование целых каталогов. Однако эта команда работает немного иначе, чем ожидалось. Давайте попробуем скопировать subdir2 каталог и присвоить копии имя subdir2_copy с помощью следующей команды:

$ cp subdir2 subdir2_copy

В результате в окне терминала выводится следующее сообщение:

cp: -r not specified; omitting directory 'subdir2'

Выполнение команды $ cp --help отображает следующее сообщение в ОС на базе Linux:

-R, -r, --recursive copy directories recursively

Флаг r, обычно используемый для обозначения рекурсивной обработки, необходим команде копирования для обработки копирования каталогов. Это также обеспечит копирование всех файлов и подкаталогов. Давайте попробуем еще раз скопировать каталог subdir2 с помощью следующей команды:

$ cp -r -v subdir2 subdir2_copy

Флаг -v указывает команде копирования выполняться в подробном режиме, в котором каждое действие описывается в консоли. Вывод следующий:

'subdir2' -> 'subdir2_copy'
'subdir2/c.txt' -> 'subdir2_copy/c.txt'
'subdir2/subdir2_subdir2' -> 'subdir2_copy/subdir2_subdir2'
'subdir2/subdir2_subdir2/b.txt' -> 'subdir2_copy/subdir2_subdir2/b.txt'
'subdir2/subdir2_subdir2/c.txt' -> 'subdir2_copy/subdir2_subdir2/c.txt'
'subdir2/subdir2_subdir2/d.txt' -> 'subdir2_copy/subdir2_subdir2/d.txt'
'subdir2/subdir2_subdir2/a.txt' -> 'subdir2_copy/subdir2_subdir2/a.txt'
'subdir2/subdir2_subdir2/e.txt' -> 'subdir2_copy/subdir2_subdir2/e.txt'
'subdir2/subdir2_subdir1' -> 'subdir2_copy/subdir2_subdir1'
'subdir2/subdir2_subdir1/d.txt' -> 'subdir2_copy/subdir2_subdir1/d.txt'
'subdir2/subdir2_subdir1/c.txt' -> 'subdir2_copy/subdir2_subdir1/c.txt'
'subdir2/subdir2_subdir1/b.txt' -> 'subdir2_copy/subdir2_subdir1/b.txt'
'subdir2/subdir2_subdir1/a.txt' -> 'subdir2_copy/subdir2_subdir1/a.txt'

Как видно из вывода флага -r, мы можем подтвердить, что все файлы и подкаталоги subdir2 были скопированы во вновь созданный файл subdir2_copy.

Подведение итогов

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

.
└── copy-examples/
├── a-copy.txt
├── a.txt
├── c.txt
├── subdir1/
│ ├── a.txt
│ ├── b.txt
│ └── c.txt
├── subdir2/
│ ├── c.txt
│ ├── subdir2_subdir1/
│ │ ├── a.txt
│ │ ├── b.txt
│ │ ├── c.txt
│ │ └── d.txt
│ └── subdir2_subdir2/
│ ├── a.txt
│ ├── b.txt
│ ├── c.txt
│ ├── d.txt
│ └── e.txt
└── subdir2_copy/
├── c.txt
├── subdir2_subdir1/
│ ├── a.txt
│ ├── b.txt
│ ├── c.txt
│ └── d.txt
└── subdir2_subdir2/
├── a.txt
├── b.txt
├── c.txt
├── d.txt
└── e.txt

Эта визуализация показывает все выполненное нами случайное копирование, а также более крупную функцию рекурсивного копирования в самом последнем разделе. Обратите внимание, что имена всех файлов и подкаталогов внутри out subdir2_copyс овпадают с исходными файлами. Единственное имя, которое изменилось, касалось родительского каталога.

Примечание. Для распечатки визуального представления всех каталогов здесь использовался сценарий Python, чтобы можно было легко отформатировать версию ASCII. Этот код Python доступен на Github. Использование следующее:

$ python3 print_dir_tree.py name-of-directory

Последние мысли

Команда копирования в Linux — это мощная утилита командной строки, которая упрощает копирование отдельных файлов, нескольких файлов или даже целых каталогов. Расширенное использование этого инструмента включает выборочное копирование файлов, принудительное копирование файлов, защищенных от чтения, и даже создание символических ссылок вместо физических файлов.

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