Главная >> Команды >> Копирование файлов в Linux

Копирование файлов в 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/

Или можем явно указать имя новой картинки:

cp ~/pic.png ~/pictures/wallpaper.png

Копирование папок осуществляется с помощью ключа -r:

cp  -R ~/папка ~/Документы/

После выполнения этой команды копирования ~/папка будет скопирована в папку ~/Документы. Главное, не забывайте поставить слэш в конце выражения или использовать опцию -t. Иначе папка ~/документы будет перезаписана.

По умолчанию команда cp Linux перезаписывает существующие файлы или папки, но можно заставить утилиту спрашивать, нужно ли перезаписывать каждый файл, если вы не уверены в правильности составления команды:

cp -i ~/test ~/Documents/test

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

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

cp -u ~/test ~/Documents/test

Сp также поддерживает специальные символы замены * и ?. Например, следующая команда скопирует все файлы, начинающиеся на test:

cp ~/test* ~/Документы/

Если нужно применить более сложные регулярные выражения, придётся комбинировать утилиту cp с find или egrep.

В случае, если важно сохранить права доступа к файлу и его владельца, нужно использовать опцию -p:

cp -p ~/test* ~/Документы/

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

$ cp test.conf{,.bak}

Будет создан файл с таким же именем и расширением .bak

По умолчанию в cp не отображается прогресс копирования файла, что очень неудобно при работе с большими файлами, но его можно легко посмотреть с помощью утилиты cv.

Копирование файлов по регулярным выражениям в Linux

В утилите find можно применять различные условия и регулярные выражения для поиска файлов. Я уже немного писал о ней в статье как найти новые файлы в Linux. Мы можем скопировать все найденные с помощью find файлы, вызвав для каждого из них команду cp. Например, копируем все файлы в текущей директории, содержащие в имени только цифры:

find . -name [0-9] -exec cp {} ~/Документы \

Здесь точка указывает на текущую директорию, а параметр name задает регулярное выражение. Параметром exec мы задаем, какую команду нужно выполнить для обнаруженных файлов. Символ {} - подставляет имя каждого файла.

Но не find'ом единым такое делается. То же самое можно получить, запросив список файлов директории в ls, отфильтровав его по регулярному выражению egrep и передав имена файлов по очереди в cp с помощью xargs:

ls -1 ~/ | egrep '[a-zA-Z]' | xargs cp -t ~/Папка/

Это не совсем удобный способ копировать файлы Linux, но всё же он возможен. Будут скопированы все файлы из домашней директории, содержащие в имени только английские буквы.

Копирование содержимого файлов в Linux

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

cat файл1 > файл2

Если файл был не пустым, он будет перезаписан. Или мы можем склеить два отдельных файла в один:

cat файл1 файл2 > файл3

Специальное копирование файлов в Linux с помощью tar

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

Утилита cp тоже может справиться с такой задачей? если указать опцию -p, но можно использовать утилиту архивации tar. Мы не будем создавать никаких файлов архивов, а построим туннель. Первая часть команды пакует файл и отправляет на стандартный вывод, а другая сразу же распаковывает в нужную папку:

tar cf - /var | ( cd /mnt/var && tar xvf - )

×

Здесь мы полностью копируем содержимое папки /var в папку /mnt/var. Так вы можете копировать папку Linux, причём абсолютно любую или даже целую операционную систему.

Выводы

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

Оцените статью

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (7 оценок, среднее: 4,14 из 5)
Загрузка...
Creative Commons License
Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

22 комментария к “Копирование файлов в Linux”

  1. Для команды cp есть ключь -p
    так вот он "Заставляет cp сохранять следующие атрибуты каждого исходного файла в создаваемой копии: время модификации, время доступа, флаги файла, режим доступа, идентификаторы пользователя и группы, насколько это позволено правами доступа."

    Ответить
  2. Подскажите такую команду: есть терминальный сервер и в нем 280 пользователей. Как задать синтаксис команды что бы скопировать или удалить файл у всех пользователей в папке home? Спасибо.

    Ответить
  3. День добрый. Вопрос такой. Командой ср настроен бэкап базы, 1 раз в сутки происходит бэкап, следовательно старый бэкап перезаписывается. Есть ли возможность , что бы он не перезаписывал, а создавал рядом папку с датой, дабы сохранять бэкапы за 5 дней

    Ответить
  4. Люди добрые подскажите как сделать копию папки как это делает винда-) без кучи примеров с использованием 12 атрибутов-)! просто взять папку целиком со всеми атт со всем что есть и нарисовать ее в другом каталоге! у меня то папка рассыпается по каталогу, сама не создается. То слетают привки, то не переносятся файлы а переносятся ток папки пустые! Зачем столько много текста написано голова уже кипит!
    И теперь запутался что значит перезапись? если я сделаю копию папки с не правильными ключами то я у исходника сотру что то?

    Ответить
    • Используйте опцию -R, получается cp -R "путь к файлу, которое будем копировать" "и путь куда копируем".
      вот типо этого получается "cp -R ~/test ~/Downloads"
      Опция -R говорит, что он копирует файлы и все вложенное.
      в примере используется символ "~", как я понял означает что путь к файлам указывается с той директории в которой находимся, сам только разбираюсь!

      Ответить
  5. У меня есть один файл, например file1.txt, и file2.txt, мне нужно скопировать содержимое первого файла во второй, но без затирания данных во втором файле, а просто добавить данные туда, какой командой это можно сделать? Спасибо!!!

    Ответить
  6. Как одной командой такое сделать я не знаю, а вот как несколькими - запросто:
    mkdir -p /backup/$(date +%F)/MyBase; cp -a /PathToBase/MyBase/* /backup/$(date +%F)/MyBase/; ls -t /backup | sed '1,5d' | xargs rm -f

    Ответить
  7. Здравствуйте. А как скопировать только файлы определённого формата ? Например нужно скопировать только текстовые файлы..

    Ответить
  8. Не срабатывает вот такая команда cp ./myfile{4..10} ./myfile.txt{4..10} или cp ./myfile{4..10} ./Catalog1/myfile.txt{4..10} Пишет что указанная цель `./Catalog1/myfile.txt10` не является каталогом. В чем моя ошибка?

    Ответить
  9. Наверное нужно набрать команду cp ./*.txt (или другое текстовое расширение которое Вам нужно) и папку назначения, например /home/(пользователь)/Документы/

    Ответить
  10. Статья немного устарела, в Ubuntu 22 gateway4 не используется.
    И сейчас мне придётся узнать как маршрут по умолчанию сделать самому 🙂

    Ответить
  11. Добрый день!
    Сейчас изучаю Линукс и есть такое задание
    Сделать в домашней директории каталог test и в нем файл test_1. После сделать на каталог test символьную ссылку с названием s_link в /tmp. А после, используя эту символьную ссылку, скопировать содержимое директории test в /tmp. И вот тут я застрял. Как скопировать этот файл, используя символьную ссылку? Перерыл разные ресурсы, ответа не нашел.
    Указываю команду cp /tmp/s_link /tmp/ - мне в ответ "cp: не указан -r; пропускается каталог '/tmp/s_link'"
    Указываю с параметром -r - выдает "cp: '/tmp/s_link' и '/tmp/s_link' - один и тот же файл.

    Ответить
  12. из всех файлов каталога /etc выделить 5-ю строку, собрать все эти строки в один файл и отсортировать его. Подскажите пожалуйсто как правильно сделать

    Ответить

Оставьте комментарий