Название утилиты cp — это сокращение от Copy, что означает копировать. Утилита позволяет полностью копировать файлы и директории.
Оглавление
СИНТАКСИС И ОПЦИИ
Общий синтаксис cp выглядит вот так:
$ cp опции файл-источник файл-приемник
Или:
$ cp опции файл-источник директория-приемник/
После выполнения команды файл-источник будет полностью перенесен в файл-приемник. Если в конце указан слэш, файл будет записан в заданную директорию с оригинальным именем.
Утилита имеет несколько интересных опций, которые могут сильно помочь при нестандартных задачах копирования, поэтому давайте их рассмотрим:
- —attributes-only — не копировать содержимое файла, а только флаги доступа и владельца;
- -f, —force — перезаписывать существующие файлы;
- -i, —interactive — спрашивать, нужно ли перезаписывать существующие файлы;
- -L — копировать несимволические ссылки, а то на что они указывают;
- -n — не перезаписывать существующие файлы;
- -P — не следовать символическим ссылкам;
- -r — копировать папку linux рекурсивно;
- -s — не выполнять копирование файлов в linux, а создавать символические ссылки;
- -u — скопировать файл, только если он был изменен;
- -x — не выходить за пределы этой файловой системы;
- -p — сохранять владельца, временные метки и флаги доступа при копировании;
- -t — считать файл-приемник директорией и копировать файл-источник в эту директорию.
Как скопировать файл из одной директории в другую с помощью Linux
Синтаксис для копирования файла с одного места на другое выглядит следующим образом:
cp /source/path/name /target/path/name
Например представьте, что вы имеете следующую структуру папок:
- home
- andreyex
- documents
- folder_one
- file_one
- file_two
- file_three
- folder_two
- file4
- folder_one
- documents
- andreyex
Если вы хотите скопировать file_one из текущего местоположения в /home/andreyex/documents/folder_one в /home/andreyex/documents/folder_two, то вы должны ввести следующую команду в командной строке:
cp /home/andreyex/documents/folder_one/file_one /home/andreyex/documents/folder_two/file_one
Ярлыки вы можете сделать здесь.
Главная часть может быть заменена на тильду (~), что объясняется в этой статье. Это изменяет команду на:
cp ~/documents/folder_one/file_one ~/documents/folder_two/file_one
Вы можете просто опустить имя файла для цели, если вы собираетесь использовать то же имя файла
cp ~/documents/folder_one/file_one ~/documents/folder_two
Если вы уже в целевой папке вы можете просто заменить путь к цели с полной остановкой.
cp ~/documents/folder_one/file_one
В качестве альтернативы, если вы уже в исходной папке вы можете просто указать имя файла в качестве источника следующим образом:
cp file_one ~/documents/folder_two
Как сделать резервную копию перед копированием файлов в Linux
В предыдущем разделе folder_one содержит файл с именем file_one и folder_two не делает. Представьте себе, что folder_two имеет файл с именем file_one и вы запустили следующую команду:
cp file_one ~/documents/folder_two
Приведенная выше команда перезапишет file_one, который в настоящее время находится в folder_two. Там нет подсказок, нет предупреждения и сообщения об ошибках, потому что, вы указали действительную команду.
Вы можете принять меры предосторожности при копировании файлов в Linux, для создания резервной копии файла, прежде чем он переписывает его. Просто используйте следующую команду:
cp -b /source/file /target/file
Например:
cp -b ~/documents/folder_one/file_one ~/documents/folder_two/file_one
В папке назначения теперь присутствует файл, который был скопирован и там будет также файл с тильдой (~) в конце, которая является резервной копией оригинального файла.
Вы можете изменить команду резервного копирования для работы в несколько ином виде, так что она создает пронумерованные резервные копии. Вы можете это сделать, если вы уже скопировали файлы и резервные копии уже существуют. Это является одной из форм контроля версий
cp –backup=numbered ~/documents/folder_one/file_one ~/documents/folder_two/file_one
Имя файла для резервных копий будет меняться: file_one.~1~, file_one.~2~ и т.д.
Как запросить перед перезаписью файлов при копировании в Linux
Если вы не хотите делать резервные копии файлов, лежащих в вашей файловой системе, но вы также хотите, убедиться, что команда копия не перезаписывает файл без разбора вы можете получить приглашение, чтобы показать вопросом, не хотите ли вы перезаписать.
Для этого используйте следующий синтаксис:
cp -i /source/file /target/file
Например:
cp -i ~/documents/folder_one/file_one ~/documents/folder_two/file_one
Сообщение будет выглядеть следующим образом : cp: overwrite ‘./file1’?
Для перезаписи файла нажмите Y на клавиатуре или для отмены нажмите N или CTRL и C одновременно.
Что происходит при копировании символьных ссылок в Linux
Символическая ссылка немного походит на ярлык на рабочем столе. Содержимое символической ссылки является адрес физического файла.
Представьте себе, вы имеете следующую структуру папок:
- home
- andreyex
- documents
- folder_one
- file_one
- folder_two
- file_one (symbolic links points to folder_one/file_one)
- folder3
- folder_one
- documents
- andreyex
Посмотрите на следующую команду:
cp ~/documents/folder_one/file_one ~/documents/folder3/file_one
Здесь не должно быть ничего нового, так как он копирует физический файл из одной папки в другую.
Что происходит, однако, если скопировать символическую ссылку из folder_two в folder3?
cp ~/documents/folder_two/file_one ~/documents/folder3/file_one
Файл, который копируется в folder3 не будет символической ссылкой. Это на самом деле файл, на который указывает символическая ссылка, так на самом деле вы получите тот же результат, как если бы путем копирования file_one из folder_one.
Кстати вы можете получить тот же результат с помощью следующей команды:
cp -H ~/documents/folder_two/file_one ~/documents/folder3/file_one
Просто чтобы быть уверенным, хотя есть еще один переключатель, который абсолютно заставляет копировать файл, а не символическую ссылку:
cp -L ~/documents/folder_two/file_one ~/documents/folder3/file_one
Если вы хотите скопировать символическую ссылку необходимо указать следующую команду:
cp -d ~/documents/folder_two/file_one ~/documents/folder3/file_one
Чтобы символическую ссылку скопировать, а не физический файл с помощью следующей команды:
cp -P ~/documents/folder_two/file_one ~documents/folder3/file_one
Как создавать жесткие ссылки с помощью команды ср
В чем разница между символической ссылкой и жесткой связи?
Символическая ссылка – это ярлык для физического файла. Он не содержит больше, чем адрес на физический файл.
Жесткая связь, на основную ссылку на тот же физический файл, но с другим именем. Это почти как прозвище. Это отличный способ организации файлов, не занимая дальнейшего дискового пространства.
Это руководство расскажет вам все, что вам нужно знать о жестких ссылках .
Вы можете создать жесткую ссылку с помощью команды ср.
cp -l ~/source/file ~/target/file
В качестве примера того, почему вы могли бы использовать жесткую ссылку учесть, что у вас есть папка под названием видео и в этой папке видео у вас есть действительно большой видео файл с именем honeymoon_video.mp4. Теперь представьте, что вы также хотите, чтобы видео быть известным как barbados_video.mp4, потому что он также имеет кадры Барбадоса.
Вы можете просто скопировать файл и дать ему новое имя, но это означает, что вы увеличиваете в два раза больше дискового пространства для того, что, по существу, то же самое видео.
Вы могли бы вместо того, чтобы создать символическую ссылку с именем barbados_video.mp4, которая указывает на файл honeymoon_video.mp4. Это будет работать хорошо, но если кто-то удалил honeymoon_video.mp4 вы остались бы со ссылкой и ничего другого и связь по-прежнему занимает дисковое пространство.
Единственное отличие состоит в том, что они содержат разное количество индексных дескрипторов. (уникальные идентификаторы). Удаление файла honeymoon_video.mp4 не удаляет файл, но только снижает количество для этого файла на 1. Файл будет удален только если все ссылки на этот файл будут удалены.
Чтобы создать ссылку вы могли бы сделать что-то вроде этого:
cp -l /videos/honeymoon_video.mp4 /videos/barbados_video.mp4
Как создать символические ссылки с помощью команды ср
Если вы хотите создать символическую ссылку вместо жесткой ссылки вы можете использовать следующую команду:
cp -s /source/file /target/file
Опять же я бы лично вообще используют команду ln -s, но вместо этого работает хорошо.
Как скопировать файлы, если они новее
Если вы хотите скопировать файлы в папку, но только с перезаписью файлов назначения, если исходный файл новее, то вы можете использовать следующую команду:
cp -u /source/file /target/file
Стоит отметить, что если файл не существует на целевой стороне, то копия будет иметь место.
2. Как скопировать несколько файлов
Если вы хотите скопировать несколько файлов одновременно в новое место, вы можете сделать это следующим образом:
cp file1 file2 file3 fileN target_directory
Эта команда скопирует все указанные файлы в целевой каталог. Если в целевом каталоге есть файл(ы), соответствующий имени исходного файла (ов), он будет перезаписан.
3. Несколько способов обработки перезаписи при копировании файлов.
Вероятно, вы не всегда хотите, чтобы ваши существующие файлы целей были перезаписаны, и это абсолютно логично.
Чтобы предотвратить перезапись существующих файлов, вы можете использовать опцию -n. Таким образом, cp выиграл ‘перезаписать существующие файлы.
cp -n source_file target_directory
Но, возможно, вы хотите перезаписать некоторые файлы. Вы можете использовать интерактивную опцию -i, и она спросит вас, хотите ли вы перезаписать существующие файлы.
cp -i source_file target_directory cp: overwrite ‘target_directory/source_file’?
Вы можете ввести y для перезаписи существующего файла или n, чтобы не переписать его.
Существует также возможность создания автоматических резервных копий. Если вы используете опцию -b с командой cp, она перезапишет существующие файлы, но до этого она создаст резервную копию перезаписанных файлов.
cp -b file.txt target_dir / file.txt ls target_dir file.txt file.txt ~
Резервная копия файла заканчивается на ~.
Вы также можете использовать параметр обновления -u, когда имеете дело с перезаписью. С параметром -u исходные файлы будут скопированы только в новое место, если исходный файл более новый, чем существующий, или если он не существует в целевом каталоге.
Подвести итоги:
- -i: Подтвердить перед перезаписью
- -n: Нет перезаписи
- -b: Перезапись с резервным копированием
- -u: Перезаписать, если целевой файл устарел или не существует
Как скопировать папки
Копирование папок такое же, как копирование файлов.
Например представьте, что вы имеете следующую структуру папок:
- home
- andreyex
- documents
- folder_one
- file_one
- file_two
- folder_two
- folder_one
- documents
- andreyex
Представьте, что вы хотите переместить папку folder_one в папку folder_two следующим образом:
- home
- andreyex
- documents
- folder_two
- folder_one
- file_one
- file_two
- folder_one
- folder_two
- documents
- andreyex
Вы можете использовать следующую команду:
cp -r /home/andreyex/documents/folder_one /home/andreyex/documents/folder_two
Кроме того, можно использовать следующую команду:
cp -R /home/andreyex/documents/folder_one /home/andreyex/documents/folder_two
Это копирует содержимое folder_one, а также любые суб-каталоги и файлы в пределах подкаталогов.
Копирование файлов и каталогов
В Bash для копирования файлов используется команда cp (от “copy”), которой обычно передаются два аргумента:
-
адрес с именем исходного файла,
-
новый адрес с именем или просто адрес каталога, куда помещается копия.
Адрес может быть как абсолютным, так относительным. Если операции с файлами выполняются в текущем каталоге, то указывать адрес смысла нет. Пишется только имя исходного файла и имя копии. Поскольку файлов с одинаковыми именами и адресами быть не может, имя копии должно отличаться от имени исходного файла.
Рассмотрим примеры.
cp readme readme2
В данном случае создается копия файла readme, которая остается в той же директории под именем readme2.
cp readme Desktop/
В папку Desktop копируется файл readme. Здесь текущим является родительский Desktop’у каталог. Имена копии и файла оригинала будут совпадать, а вот полные адреса – нет.
cp/home/irina/tux.png /mnt/D/pingvin.png
Здесь копируется файл из одного каталога в другой, используются абсолютные адреса, имя копии изменяется.
Если надо скопировать несколько разных файлов в один и тот же каталог, то после команды cd сначала перечисляются все файлы-оригиналы, а последним указывается каталог, куда помещаются копии. Понятно, что при таком групповом действии имена файлов изменить нельзя.
Чтобы скопировать каталог со всем его содержимым, необходимо использовать ключ -r команды cp:
cp-r ./letters ./oldletters
Перемещение и переименование
В Bash-оболочке Linux для перемещения и переименования используется одна и та же команда – mv (от “move” – перемещать). Переименование можно рассматривать как частный случай перемещения, ведь по-сути изменяется полный адрес файла, что равносильно перемещению, даже если файл остается в том же каталоге.
Также как в случае cp, для mv необходимо указать пару аргументов. Выбор между перемещением и переименованием зависит от того, что это за аргументы. При перемещении файл меняет свой адрес, следовательно, если в первом и втором аргументах указаны разные адреса, то произойдет перемещение. Если адреса одинаковые, а различаются только имена, происходит переименование. Кроме того, перемещение может быть совмещено с переименованием.
В случае перемещения без переименования во втором аргументе указывается только каталог места назначения.
mv document.txt Work
mv document.txt Work/doc23.txt
Здесь в первом случае файл document.txt перемещается в каталог Work. Во-втором случае одновременно происходит перемещение файла и его переименование: файл document.txt перемещается в директорию Work и получает новое имя doc23.txt.
При использовании команды mv для переименования в качестве второго аргумента указывается новое имя:
mv order.txt orderNew.txt
mv Work/list.odt Work/names.odt
Каталоги перемещаются и переименовываются по тому же принципу, что и файлы. Групповое перемещение файлов работает также, как с командой cp.
Создание файлов и каталогов
Новые директории создаются командой mkdir. Например, чтобы создать каталог Work в текущей директории необходимо выполнить следующую команду:
mkdir Work
или
mkdir ./Work
Существует множество способов создания файлов, обычно они создаются какой-либо программой. Если все же возникает необходимость создать пустой файл, сделать это можно с помощью программы touch. В качестве аргумента ей передается имя создаваемого файла. Еще один способ – перенаправление вывода какой-либо команды в файл. Пример:
cal> ./Work/January
Здесь программа cal выводит календарь на текущий месяц, а поскольку стоит знак перенаправления вывода, то вывод команды будет записан в файл January, находящийся в папке Work.
Удаление файлов и каталогов
Для удаления файлов используется команда rm. Например:
rm ghost.png
Командой rmdir можно удалить пустой каталог. Если же каталог не пуст, следует использовать команду rm с ключом -r:
Вопросы
У вас в каталоге есть файлы с разными расширениями. Вам надо группу файлов, имеющих одно и тоже расширение, скопировать в другой каталог. Как это сделать одной командой?
Какой ключ надо использовать, чтобы при перемещении случайно не перезаписать уже имеющийся в каталоге файл с таким именем?
Курс с ответами к заданиям и дополнительными уроками:
android-приложение, pdf-версия.
- Добавить комментарий
6. Как скопировать несколько каталогов
Вы также можете скопировать несколько каталогов одновременно с помощью команды cp в Linux.
Просто используйте его так же, как и для одного каталога.
cp -r source_dir1 source_dir2 source_dir3 target_dir
Это всегда последний аргумент в команде, который принимается как целевой каталог.
Если вы хотите скопировать только содержимое нескольких каталогов одновременно, вы также можете это сделать:
cp -r source_dir1 /. source_dir2 /. source_dir3 /. target_dir
Фактически, вы можете смешивать каталоги, их содержимое и файлы в целом.
cp -r source_dir1 source_dir2 /. source_file target_dirСоветВы можете использовать подробный режим с опцией -v, чтобы посмотреть, какие файлы копируются.
7. Как сохранить атрибуты при копировании
Когда вы копируете файл в новое место, его атрибуты, такие как права доступа к файлам и временные метки файла, изменяются.
Если вы хотите сохранить атрибуты исходного файла, вы можете скопировать файлы с помощью опции -p.
Давайте посмотрим на пример.
ls -l /etc/services -rw-r – r– 1 root root 19183 12 Jan 2018 /etc/services
Если я попытаюсь скопировать этот файл, его атрибуты будут изменены:
ls -l /etc/services -rw-r–r– 1 root root 19183 Jan 12 2018 /etc/services
Но если мы используем параметр p, скопированный файл сохранит режим, право собственности и отметку времени.
cp /etc/services . ls -l services -rwxrwxrwx 1 andreyex andreyex 19183 Nov 27 23:16 services
Как вы можете видеть, вы сохранили режим доступа и временную метку исходного файла с опцией -p.
Но подождите! Разве это не должно было сохранить право собственности на исходные файлы? Но вот владелец (root) исходного файла был изменен на andreyex,
Это связано с тем, что только root имеет разрешение на изменение права собственности на файл, принадлежащий root. Если вы используете опцию -p с файлом, не принадлежащим root, он сохранит право собственности. Или вы можете запустить команду с помощью sudo, это сохранит право собственности на файл, принадлежащий root.
Вы также можете указать атрибуты, которые хотите сохранить. Но тогда вам придется использовать опцию -preserve.
cp –preserve=timestamp /etc/services . ls -l services -rw-r–r– 1 andreyex andreyex 19183 Jan 12 2018 services
Как видно из вышеприведенного вывода, команда сохранила только временную метку исходного файла.
Примеры, показанные здесь, являются наиболее распространенными, которые вы будете использовать в качестве пользователя Linux, сисадмина или разработчика программного обеспечения.
Если вам понравилась эта статья, пожалуйста, поделитесь этой статьей о социальных сетях и различных форумах.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Перекрёстные ссылки книги для Копирование, перемещение, создание и удаление файлов и каталогов
- Команда ls – просмотр каталога
- Вверх
- Жесткие и символьные ссылки
Linux
ПРИМЕРЫ КОПИРОВАНИЯ ФАЙЛОВ В 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 позволяет копировать файл, только если уже существующий более старой версии, чем новый:
cp -u ~/test ~/Documents/test
cp также поддерживает специальные символы замены * и ?. Например, следующая команда скопирует все файлы, начинающиеся на test:
cp ~/test* ~/Документы/
Если нужно применить более сложные регулярные выражения, придется комбинировать утилиту cp с find или egrep.
В случае если важно сохранить права доступа к файлу и его владельца нужно использовать опцию -p:
cp -p ~/test* ~/Документы/
Для упрощения использования команды можно использовать синтаксис фигурных скобок. Например, чтобы создать резервную копию файла выполните:
$ cp test.conf{,.bak}
Будет создан файл с таким же именем и расширением .bak
По умолчанию в cp не отображается прогресс копирования файла, что очень неудобно при работе с большими файлами, но его можно легко посмотреть с помощью утилиты cv.
Скопировать файл в другую директорию
Скопируем файл myfile.txt в директорию mydir:
cp myfile.txt mydir
Скопируем файл myfile1.txt в новый файл myfile2.txt
cp myfile1.txt myfile2.txt
Скопировать несколько файлов
Для копирования нескольких файлов нужно перечислить их через пробел. Послений параметр определяет результирующую директорию, в которую будут скопированы файлы.
cp /etc/config/myfile1.txt /home/pupkin/myfile1.txt /mnt/some/myfile3.txt mydir
Скопировать файл с подтверждением
Выведем запрос на подтверждение перезаписи результирующего файла, если он существует:
cp -i myfile1.txt myfile2.txt cp: переписать ‘myfile2.txt’? y
Показать информацию о копируемых файлах
При использовании опции -v выводится информация о том, какие файлы и куда копируются.
cp -v myfile1.txt myfile2.txt mydir/ ‘myfile1.txt’ -> ‘mydir/myfile1.txt’ ‘myfile2.txt’ -> ‘mydir/myfile2.txt’
Скопировать директорию
Чтобы скопировать директорию и все ее содержимое нужно использовать опцию -r
cp -r /home/pupkin/mydir /mnt/usbflash
Скопировать только если файлы новее
Скопируем файлы вида myfile*.txt (например, это могут быть файлы myfile1.txtmyfile10.txtmyfile2.txt) в директорию mydir, но если результирующий файл существует, то копирование выполняется только в том случае, если исходный файл новее.
cp -u myfile*.txt mydir
Не перезаписывать существующие файлы
Чтобы существующие файлы не перезаписывались, используется опция -n
cp -n /home/pupkin/mydir /mnt/usbflash
Скопировать только атрибуты
Скопируем только атрибуты файла. Содержимое файла не копируется.
cp –attributes-only myfile1.txt myfile2.txt
Создать резервную копию для результирующих файлов, если они существуют
Скопируем файл myfile1.txt в файл myfile2.txt. Если файл myfile2.txt существует, то будет создана его резервная копия.
cp -b myfile1.txt myfile2.txt
Принудительно перезаписывать существующие файлы назначения
Если файл назначения существует и не может быть открыт и удален, то можно использовать опцию -f, чтобы принудительно перезаписать такой файл:
cp -f myfile1.txt myfile2.txt
[spoiler title=”Источники”]
- https://www.lcnt.ru/?p=213
- https://andreyex.ru/linux/komandy-linux-i-komandy-shell/kak-skopirovat-fajly-s-pomoshhyu-komandy-sr-v-linux/
- https://andreyex.ru/operacionnaya-sistema-linux/komanda-cp-v-linux-7-prakticheskih-primerov/
- https://younglinux.info/bash/cpmv.php
- https://pingvinus.ru/note/cmd-cp