Копирование файлов в Linux. Команды more и less

В предыдущих разделах мы уже упоминали некоторые команды для работы с файлами и каталогами: pwd, cd, ls, ln, chmod. В этом разделе рассмотрим (очень кратко) еще несколько часто используемых команд.

4.6.1. Команды chown и chgrp

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

# chown vasja имя-файла

# chgrp usersgrp имя-файла

4.6.2. Команда mkdir

Команда mkdir позволяет создать подкаталог в текущем каталоге. В качестве аргумента этой команде надо дать имя создаваемого каталога. Во вновь созданном каталоге автоматически создаются две записи: . (ссылка на этот самый каталог) и .. (ссылка на родительский каталог). Чтобы создать подкаталог, вы должны иметь в текущем каталоге право записи. Можно создать подкаталог не в текущем, а в каком-то другом каталоге, но тогда необходимо указать путь к создаваемому каталогу:

$ mkdir /home/kos/book/glava5/part1

Команда mkdir может использоваться со следующими опциями:

    M mode — задает режим доступа для нового каталога (например, -m 755 ) ;

    P — создавать указанные промежуточные каталоги (если они не существуют).

4.6.3. Команда cat

Команда cat часто используется для создания файлов (хотя можно воспользоваться и командой touch ). По команде cat на стандартный вывод (т. е. на экран) выводится содержимое указанного файла (или нескольких файлов, если их имена последовательно задать в качестве аргументов команды). Если вывод команды cat перенаправить в файл, то можно получить копию какого-то файла:

$ cat file1 > file2

Собственно, первоначальное предназначение команды cat как раз и предполагало перенаправление вывода, так как эта команда создана для конкатенации, т. е. объединения нескольких файлов в один:

$ cat file1 file2 ... fileN > new-file

Именно возможности перенаправления ввода и вывода этой команды и используются для создания новых файлов. Для этого на вход команды cat направляют данные со стандартного ввода (т. е. с клавиатуры), а вывод команды — в новый файл:

$ cat > newfile

После того, как вы напечатаете все, что хотите, нажмите комбинацию клавиш < Ctrl>+ или < Ctrl>+, и все, что вы ввели, будет записано в newfile . Конечно, таким образом создаются, в основном, короткие текстовые файлы.

4.6.4. Команда cp

Хотя для копирования файлов иногда пользуются командой cat , но в Linux существует для этого специальная команда cp . Ее можно применять в одной из двух форм:

$ cp source destination

$ cp source_directory new_directory

В первом случае файл или каталог source копируется, соответственно, в файл или каталог destination, а во втором случае файлы, содержащиеся в каталоге source_directory копируются в каталог new_directory. Для копирования надо иметь права на чтение файлов, которые копируются, и права на запись в каталог, в который производится копирование.

Если в качестве целевого указывается существующий файл, то его содержимое будет затерто, поэтому при копировании надо соблюдать осторожность. Впрочем, можно использовать команду cp с опцией -i, тогда перед перезаписью существующего файла будет запрашиваться подтверждение (очень рекомендую вам всегда использовать эту опцию!).

У команды cp имеется еще несколько полезных опций (табл. 4.3).

Таблица 4.3. Основные опции команды cd.

Опция

Значение

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

R или -r

Если source — каталог, то копируется как он, так и все входящие в него подкаталоги, т. е. сохраняется исходная форма дерева каталогов

Если задать эту опцию, то символические ссылки будут оставаться ссылками (а иначе вместо ссылки копируется файл, на который дается ссылка)

Перезаписывать файлы при копировании (если такие уже есть) без дополнительных предупреждений

4.6.5. Команда mv

Если вам необходимо не скопировать, а переместить файл из одного каталога в другой, вы можете воспользоваться командой mv . Синтаксис этой команды аналогичен синтаксису команды cp . Более того, она сначала копирует файл (или каталог), а только потом удаляет исходный файл (каталог). И опции у нее такие же, как у cp .

Команда mv может использоваться не только для перемещения, но и для переименования файлов и каталогов (т. е. перемещения их внутри одного каталога). Для этого надо просто задать в качестве аргументов старое и новое имя файла:

$ mv oldname newname

Но учтите, что команда mv не позволяет переименовать сразу несколько файлов (используя шаблон имени), так что команда mv *.xxx *.yyy не будет работать.

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

4.6.6. Команды rm и rmdir

Для удаления ненужных файлов и каталогов в Linux служат команды rm (удаляет файлы) и rmdir (удаляет пустой каталог). Для того, чтобы воспользовался этими командами, вы должны иметь право записи в каталоге, в котором расположены удаляемые файлы или каталоги. При этом полномочия на изменение самих файлов не обязательны. Если хотите перед удалением файла получить дополнительный запрос на подтверждение операции, используйте опцию -i.

Если вы попытаетесь использовать команду rm (без всяких опций) для удаления каталога, то будет выдано сообщение, что это каталог, и удаления не произойдет. Для удаления каталога надо удалить в нем все файлы, после чего удалить сам каталог с помощью команды rmdir . Однако можно удалить и непустой каталог со всеми входящими в него подкаталогами и файлами, если использовать команду rm с опцией -r.

Если вы дадите команду rm * , то удалите все файлы в текущем каталоге. Подкаталоги при этом не удалятся. Для удаления как файлов, так и подкаталогов текущего каталога надо тоже воспользоваться опцией -r . Однако всегда помните, что в Linux нет команды восстановления файлов после их удаления (даже если вы спохватились сразу же после ошибочного удаления файла или каталога)!

Так что дважды подумайте до удаления чего-либо и не пренебрегайте опцией -i .

4.6.7. Команды more и less

Команда cat позволяет вывести на стандартный вывод (на экран) содержимое любого файла, однако она используется для этих целей очень редко, разве что для вывода очень небольших по объему файлов. Дело в том, что содержимое большого файла мгновенно проскакивает на экране, и пользователь видит только последние строки файла. Поэтому cat используется в основном по ее прямому назначению — для конкатенации файлов, а для просмотра содержимого файлов (конечно, текстовых) используются команды more и less (или текстовые редакторы).

Команда-фильтр more выводит содержимое файла на экран отдельными страницами, размером как раз в целый экран. Для того, чтобы увидеть следующую страницу, надо нажать на клавишу пробела. Нажатие на клавишу < Enter> приводит к смещению на одну строку. Кроме клавиш пробела и < Enter> в режиме паузы еще некоторые клавиши действуют как управляющие (например, клавиша возвращает вас на один экран назад), но мы здесь не будем приводить полного их перечня, как и перечня опций команды. Вам для начала надо еще только запомнить, что выйти из режима просмотра можно с помощью клавиши < Q> , так как если вы этого не знаете, то вам придется долго и нудно нажимать пробел, пока вы не доберетесь до конца длинного файла. Обо всех опциях команды more вы можете прочитать в интерактивном руководстве man или info.

Утилита less , разработанная в рамках проекта GNU, содержит все функции и команды управления выводом, имеющиеся в программе more , и некоторые дополнительные, например, позволяет использовать клавиши управления курсором (<Стрелка вверх>, <Стрелка вниз>, , ) для перемещения по тексту. Вспомните, мы уже говорили об этом, когда рассматривали интерактивную подсказкуman .

Команды more и less позволяют производить поиск подстроки в просматриваемом файле, причем команда less позволяет производить поиск как в прямом, так и в обратном направлении. Для организации поиска строки символов string надо набрать в командной строке программы в нижней части экрана (там, где двоеточие) /string. Если искомая строка будет найдена, будет отображен соответствующий кусок текста, причем найденная строка будет находиться в самом верху экрана.

4.6.8. Команда find и символы шаблонов для имен файлов

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

Общий синтаксис команды find имеет следующий вид:

find [список_каталогов] критерий_поиска

Параметр "список_каталогов" определяет, где искать нужный файл. Проще всего задать в качестве начального каталога поиска корневой каталог /, однако, в таком случае поиск может затянуться очень надолго, так как будет просматриваться вся структура каталогов, включая смонтированные файловые системы (в том числе сетевые, если таковые есть). Можно сократить объем поиска, если задать вместо одного корневого каталога список из нескольких каталогов (естественно, тех, в которых может находиться искомый файл):

$ find /usr/share/doc /usr/doc /usr/locale/doc -name instr.txt

Началом "критерия_поиска", определяющего, что именно должна искать программа find , считается первый аргумент, начинающийся на "-", "(", ")"", "," или "!". Все аргументы, предшествующие "критерию_поиска", трактуются как имена каталогов, в которых надо производить поиск. Если не указано ни одного пути, поиск производится только в текущем каталоге и его подкаталогах.

Чаще всего поиск проводится по именам файлов, как это показано в предыдущем примере, т. е. "критерий_поиска" задается как "-name имя_файла". Вместо опции -name можно использовать опцию -path, тогда команда будет искать совпадения в полном имени файла, с указанием пути. Например, команда

$ find . -path "./sr*sc"

найдет в текущем каталоге подкаталог "./src/misc". Вместо полного имени файла или каталога в этом примере использован так называемый "шаблон имени". Поскольку шаблоны имен файлов могут использоваться не только с командой find , но и со многими другими командами (включая уже рассмотренные команды chmod, chown, chgrp, cp, rm, cat, mv ), то правилам составления шаблонов стоит уделить некоторое внимание.

Чаще всего шаблоны имен файлов строятся с помощью специальных символов "*" и "?". Значок "*" используется для замены произвольной строки символов. В Linux

    "*" — соответствует всем файлам, за исключением скрытых;

    ".*" — соответствует всем скрытым файлам (но также текущему каталогу ". " и каталогу уровнем выше ".. ": не забывайте об этом!);

    "*.*" — соответствует только тем файлам и каталогам, которые имеют ". " в середине имени, или оканчиваются на точку;

    "p*r" — соответствует и "peter" и "piper";

    "*c*" — соответствует и "picked" и "peck".

Значок ? заменяет один произвольный символ, поэтому index?.htm будет соответствовать именам index0.htm, index5.htm и indexa.htm.

Кроме "*" и "?" в Linux при задании шаблонов имен можно использовать квадратные скобки , в которых дается либо список возможных символов, либо интервал, в который должны попадать возможные символы. Например, * соответствует всем именам файлов, начинающимся с a, b, c; * соответствует файлам, имена которых оканчиваются на I, J, K, L, M, N, 1, 2, 3.

А теперь вернемся к команде find и расскажем подробнее о том, какие критерии поиска возможны. Несколько примеров простых критериев поиска перечислены в табл. 4.4.

Таблица 4.4. Критерии поиска для команды find.

Опция

Значение

Name шаблон

Ищет файлы, имена которых соответствуют шаблону

Group имя

Ищет файлы, принадлежащие указанной группе

Size число [c]

Ищет файлы, размером в число 512-байтных блоков. Если после числа стоит символ c, значит размер указан в байтах (символах)

Mtime число

Ищет файлы, которые в последний раз изменялись указанное число дней назад

Newer образец

Ищет файлы, которые изменялись после изменения файла, указанного в образце

Type тип_файла

Ищет файлы указанного типа. Тип задается одним из символов b (блок-ориентированные устройства), c (байт-ориентированные устройства), d (файл каталога), f (обычный файл), p (именованный канал) либо l (символическая ссылка)

Другие простые критерии вы можете узнать, если просмотрите man-страницу о команде find . Здесь же надо только сказать, что из простых критериев можно строить более сложные с помощью логических операций and , or или операции отрицания, знаком которой служит восклицательный знак. Например, если вы хотите найти все файлы, имена которых оканчиваются на.txt и.doc, то критерий можно записать как (-name *.txt -or -name *.doc) . Можно комбинировать таким образом любое число критериев (и не только простых!). Если операция не указана явно, то подразумевается -and , т. е. вместо (-name *.txt -and -name *.doc) можно записать просто (-name *.txt -name *.doc) . Если применяется только одна операция -and или ! , то скобки обычно можно опустить, а с операцией -or и в сложных выражениях скобки необходимы. Перед скобкой нужно поставить обратную косую черту, а после скобки — пробел. Например, если вы хотите найти каталог по его имени, то можно сделать это командой

$ find /usr -name doc -type d

или (с соблюдением правил построения сложных критериев)

$ find /usr \(-name doc -and -type d \)

В следующем примере мы ищем файлы по такому критерию: либо имя файла оканчивается на *.tmp, либо размер файла больше 100 Кбайт.

$ find /home/kos \(\(-name *.tmp \) -or \(-size +200 \) \)

В последнем примере стоит обратить внимание на то, что перед значением размера стоит знак "+". Такой знак можно использовать с любым числовым параметром в критериях поиска команды find . Он означает, что нужно искать файлы, у которых значение параметра больше заданного. Соответственно, знак "- " означает, что надо искать файлы, у которых значение параметра меньше заданного. Если знаки + или — отсутствует, ищутся файлы, у которых значение параметра равно заданному.

Чтобы закончить рассмотрение команды find , надо сказать еще о том, что после критерия поиска в этой команде можно сразу же задать операцию, которая будет применяться ко всем файлам, найденным по указанному критерию. Простейшим примером использования такой возможности является указание команды -print .

$ find /home/kos -name *.tmp -print

по которой выдается на экран список имен всех найденных файлов с указанием полного пути к файлу. Эта операция применяется по умолчанию, т. е. когда никаких операций вообще не указано (как это было во всех приведенных выше примерах). Другим примером операции, применяемой ко всем найденным файлам, может служить операция -exec cmd {} \; , где cmd — произвольная команда оболочки shell. То есть в этом случае ко всем найденным файлам (их именами заменяются поочередно фигурные скобки) применяется команда cmd . За cmd {} в этом случае должна следовать точка с запятой, экранированная обратной косой чертой.

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

# find . -type f -atime +30 -exec rm {} \;

Вместо -exec можно поставить -ok, тогда перед выполнением указанной команды cmd применительно к каждому файлу будет запрашиваться подтверждение.

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

4.6.9. Команда split — разбиваем файл на несколько частей

Иногда бывает необходимо разбить один большой файл на несколько файлов меньшего объема. Для примера рассмотрим ситуацию, когда вы хотите перенести на свой домашний компьютер файл song.mp3 формата "MP3", размером в 4,894,425 байт. Возможности перекачать этот файл по сети у вас нет, и единственно возможный способ переноса — воспользоваться дискетами. Но, поскольку на одну дискету файл не помещается, требуется разбить его на несколько маленьких файлов, а потом "собрать" снова. Для решения этой задачи можно воспользоваться командой split .

Команда split копирует файл, разбивая его на отдельные файлы заданной длины. В качестве аргументов ей надо указать имя исходного файла и префикс имен выходных файлов. Имена выходных файлов будут составляться из этого префикса и двух дополнительных букв `aa" , `ab" , `ac" и т. д. (без пробелов и точек между префиксом и буквами). Если префикс имен файлов не задан, то по умолчанию используется ‘x’, так что выходные файлы будут называться ` xaa" , ` xab"и т. д. .

Кроме аргументов можно задать опцию -b, определяющую размер выходных файлов в байтах. Вслед за -b должно стоять число, а за ним — буква k (показывающая, что размер выходного файла указан в килобайтах) или m (значит размер задан в мегабайтах). Если опция не задана, то по умолчанию размер выходных файлов принимается равным 1 Мбайту. Таким образом, чтобы перенести на дискетах файл song.mp3 надо вначале дать команду

$ split -b1400k song.mp3 song.

скопировать полученные файлы song.aa, song.ab, song.ac, song.ad, song.ae на отдельные дискеты, перенести их на домашний компьютер, скопировать в какой-нибудь каталог и восстановить исходный файл с помощью команды

$ cat song.* > song.mp3

после чего можно удалить временные файлы song.xx.

4.6.10. Сравнение файлов и команда patch

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

Простейший из них — команда cmp . Эта команда просто сравнивает содержимое двух файлов по-байтно:

$ cmp file1 file2

Если файлы полностью совпадают, она молча заканчивает свою работу (происходит возврат к командной строке без каких-либо дополнительных сообщений), а если файлы различаются, выдаются номер строки и номер байта в строке, где имеет место первое различие.

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

$ diff paper.old paper.new

Отчет о выявленных различиях будет выдан на стандартный выход. Естественно, его лучше перенаправить в файл:

$ diff paper.old paper.new >paper.diff

Для оценки версий одного и того же файла более удобна может оказаться команда sdiff , которая выдает результат сравнения в виде двух столбцов, разделенных пробелами. Если строки с одинаковыми номерами в файлах различаются, то в выводе команды sdiff они разделены вертикальной чертой | . Если строка имеется только в первом файле, она отмечена знаком < . Соответственно, строка, встречающаяся только во втором файле, помечена знаком > .

Существует также команда diff3 , которая позволяет сравнить сразу 3 файла.

Но все же наиболее часто используется традиционная для UNIX-систем команда diff . Эта ее востребованность объясняется тем, что создаваемый ею отчет о различиях двух файлов может быть использован командой patch . Чаще всего эти возможности используются при распространении обновлений программного обеспечения. Предположим, что некоторое программное приложение было разослано пользователям в виде файла program.c, содержащего исходный код программы на языке Си. После этого разработчик внес в программу некоторые исправления и сохранил текст в виде файла program.c.new. Требуется довести исправленный текст программы до пользователей. Очевидно, что пользователям достаточно сообщить только исправления, т. е. отчет об изменениях, создаваемый по команде

$ diff program.c program.c.new > program.c.diff

Естественно, объем файла program.c.diff существенно меньше объема файла program.c.new, так что можно было бы получить существенную экономию на передаче файлов, если отправлять пользователям только файл program.c.diff(ведь объемы современных программных приложений составляют десятки мегабайт).Однако пользователи должны иметь возможность внести эти исправления в имеющуюся у них версию программы. Эту задачу позволяет решить команда patch . Имея файлы program.c и program.c.diff, пользователь может дать команду

$ patch program.c program.c.diff > program.c.new

в результате выполнения которой он получит файл program.c.new.

В. Костромин (kos at rus-linux dot net) - 4.6. Команды для работы с файлами и каталогами

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

Команда использующаяся для копирования файлов является ср.

Как скопировать файл из одной директории в другую с помощью Linux

Синтаксис для копирования файла с одного места на другое выглядит следующим образом:

Cp /source/path/name /target/path/name

  • home
    • andreyex
      • documents
        • folder_one
          • file_one
          • file_two
          • file_three
        • folder_two
          • file4

Если вы хотите скопировать file_one из текущего местоположения в / home/ documents / folder_one в / home/ 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

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

Как сделать резервную копию перед копированием файлов в 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

Имя файла для резервных копий будет вдоль меняться 1.~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

Посмотрите на следующую команду:

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

Стоит отметить, что если файл не существует на целевой стороне, то копия будет иметь место.

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

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

Cp /source/file_one /source/file_two /source/file_three /target

Приведенная выше команда будет копировать file_one, file_two и file_three в целевую папку.

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

Cp /home/andreyex/music/*.mp3 /home/andreyex/music2

Приведенная выше команда будет копировать все файлы с расширением.mp3 в папку music2.

Как скопировать папки

Копирование папок такое же, как копирование файлов.

Например представьте, что вы имеете следующую структуру папок:

  • home
    • andreyex
      • documents
        • folder_one
          • file_one
          • file_two
        • folder_two

Представьте, что вы хотите переместить папку folder_one в папку folder_two следующим образом:

  • home
    • andreyex
      • documents
        • folder_two
          • folder_one
            • file_one
            • file_two

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

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, а также любые суб-каталоги и файлы в пределах подкаталогов.

Резюме

Это руководство дало вам инструменты требующиеся для копирования файлов в Linux. Для всего остального вы можете использовать команду Linux man.

Updated: 12/29/2017 by Computer Hope

About cp

The cp command is makes copies of files and directories.

Syntax

cp [option ]... [-T ] source destination cp [option ]... source ... directory cp [option ]... -t directory source ... cp --help cp --version

Options

-a ,
--archive
Same as -dR --preserve=ALL . When performing the copy, attempt to preserve as much of the original file structure, attributes, and associated metadata as possible. This metadata includes security context data if you are running SELinux .
--attributes-only Don"t copy the file data, just create a file with the same attributes . If the destination file already exists, don"t alter its contents. You can control exactly which attributes are copied with the --preserve option.
--backup [= control ] Make a backup of each existing destination file that would otherwise be overwritten or removed. The control parameter specifies what version control method to use; see for details.

As a special case, cp --force --backup will make a backup of source when source and dest are the same, regular file.

-b Like --backup , but does not accept a control argument; the default control method is always used.
--copy-contents When operating recursively , copy contents of special files, such as FIFOs and devices found in /dev . You usually don"t want to use this option, because it can have undesired results, such as hanging forever or filling up your entire disk. However, this option is available for special, expert use cases.
-d Copy symbolic links themselves, rather than the files they refer to, and preserve hard links between source files in the copies. Same as "--no-dereference --preserve=links ".
-f ,
--force
If an existing destination file cannot be opened, remove it and try again. This option has no effect if the -n /--no-clobber option is used. However, it applies independently of -i /--interactive ; neither option cancels the effect of the other.
-i ,
--interactive
Prompt before overwrite (overrides a previous -n option).
-H Follow symlinks specified on the command line, but preserve discovered links.

The directory representing the mount point itself will be copied, but not traversed.

If -v is specified, you will see exactly which files have been skipped.

--help Display a help message, and exit.
--version Output version information, and exit.

By default, sparse source files are detected by a crude heuristic and the corresponding destination file is made sparse as well. That is the behavior selected by --sparse=auto . Specify --sparse=always to create a sparse destination file whenever the source file contains a long enough sequence of zero bytes. Use --sparse=never to inhibit creation of sparse files.

When --reflink [=always ] is specified, cp performs a lightweight copy, where the data blocks are copied only when modified. If this is not possible, the copy fails; or, if --reflink=auto is specified, cp falls back to a standard copy operation.

Version control

When using -b /--backup , the backup suffix is "~ ", unless set with --suffix or SIMPLE_BACKUP_SUFFIX . The version control method may be selected via the --backup= control option or through the VERSION_CONTROL environment variable . The possible values of control or VERSION_CONTROL are:

none , off Never make backups (even if --backup is given).
numbered , t Make numbered backups.
existing , nil Numbered if numbered backups exist, simple otherwise.
simple , never Always make simple backups.

As a special case, cp makes a backup of source when the force and backup options are given and source and destination are the same name for an existing, regular file.

Examples

Let"s say you have a file named picture.jpg in your working directory , and you want to make a copy of it called picture-02.jpg . You would run the command:

Cp picture.jpg picture-02.jpg

And the file will be copied. Here, picture.jpg is the source of the copy operation, and picture-02.jpg is the destination. Both files now exist in your working directory.

The source and destination files may also reside in different directories. For instance,

Cp /home/chuck/pictures/picture.jpg /home/chuck/backup/picture.jpg

Will make a copy of the file /home/chuck/pictures/picture.jpg in the directory /home/chuck/backup . The destination file will also be named picture.jpg .

If you are the user chuck , you can abbreviate your home directory ("/home/chuck ") using a tilde ("~ "). For instance,

Cp ~/pictures/picture.jpg ~/backup/picture.jpg

Functions the same as the above command when it is run by chuck .

Copying multiple files to a directory

Or, perhaps you want to copy multiple files into another directory. To accomplish this, you can specify multiple files as the source, and a directory name as the destination. Let"s say you are the user sally , and you have a bunch of files in the directory /home/sally/pictures/ named picture-01.jpg , picture-02.jpg , etc. and you want to copy them into the directory /home/sally/picture-backup/ . This command will do the trick:

Cp ~/pictures/picture-*.jpg ~/picture-backup cp -i oldfile newfile

If newfile already exists, you will be prompted:

Cp: overwrite ‘newfile’?

If you type y (or yes , Y , YES , or any other combination of upper and lowercase of these), then newfile will be overwritten with a copy of origfile . Typing anything else will abort the operation.

Copy a file into another directory

cp origfile /directory/subdirectory

origfile . The copy will be located in the directory /directory/subdirectory , and will be named origfile .

Cp origfile /directory/subdirectory/.

Same as the above command. The slash-dot (/. ) is implied in the above form of the command. (The dot is a special file in every Linux directory which means "this directory.")

Copy a file into another directory, and give it a new name

cp origfile /directory/subdirectory/newfile

Creates a copy of the file in the working directory named origfile . The copy will be named newfile , and will be located in the directory /directory/subdirectory .

Copy multiple files into another directory, using a wildcard

cp file* /directory/subdirectory

file into the directory /directory/subdirectory . The asterisk ("* ") is a wildcard — a special character which expands to match other characters. Specifically, the asterisk wildcard matches zero or more non-whitespace characters. For instance, this command will copy any files named file , file001 , file.txt , fileone.jpg , file-archive.zip , etc.

Cp file*.jpg /directory/subdirectory

Copy every file in the working directory whose name begins with file , and ends with the file extension .jpg . For instance, it would make copies of any files named file , file001.jpg , file002.jpg , or file-new.jpg , etc. The copies will be placed into the directory /directory/subdirectory .

Copy an entire directory structure to another location

cp -R /one/two /three/four

Copy the directory two (located in the directory /one ), and everything two contains, into the destination directory /three/four . The result will be called /three/four/two . The directory /three must already exist for the command to succeed. If the directory four does not already exist in the directory /three , it will be created.

Cp file1.txt newdir

Copies the file1.txt in the working directory to the newdir subdirectory.

Cp /home/public_html/mylog.txt /home/public_html/backup/mylog.bak

Copies the file mylog.txt in the public_html directory into the public_html/backup directory as mylog.bak .

Cp -u *.txt newdir

Copy all files ending in .txt into the newdir directory, but only if the files do not already exist in the new directory, or if the files being copied are newer.

Cp -R /home/hope/files/* /home/hope/backup

Recursively copies all the files, directories, and subdirectories in the /home/hope/files directory into the /home/hope/backup directory. If the directory backup does not exist in the directory /home/hope , it will be created.

cp --backup origfile newfile

If newfile newfile origfile . By default, the backup of newfile will be named newfile~ .

cp --backup=numbered origfile newfile

If newfile already exists, make a backup of the existing newfile before overwriting it with a copy of origfile . The backup of newfile will be named newfile.~1~ if no other backup exists, or newfile.~2~ if newfile.~1~ exists, etc.

Related commands

dd — Copy and convert the encoding of files.
ln — Create a link, or a symbolic link, to a file or directory.
mv — Move files and directories from one location to another, and optionally rename them.

cp - копирование файлов и каталогов

ОБЗОР

cp [ опции ] файл путь cp [ опции ] файл... каталог Опции POSIX: [-fiprR] [--] Дополнительные опции POSIX 1003.1-2003: [-HLP] Опции GNU file-utils 4.0 (краткая форма): [-abdfilprsuvxPR] [-S СУФФИКС ] [-V {numbered,existing,simple}] [--backup= CONTROL ] [--sparse= КОГДА ] [--help] [--version] [--] Дополнительные опции GNU file-utils 4.1 (краткая форма): [-HLP] [--copy-contents] [--no-preserve] [--reply= HOW ] [--remove-destination] [--strip-trailing-slashes] [--target-directory= DIR ]

ОПИСАНИЕ

cp копирует файлы (или, если попросить, каталоги). Вы можете либо копировать один файл в другой, заданный файл, либо копировать сколько угодно файлов в заданный каталог. Если последний аргумент является существующим каталогом, то cp копирует каждый исходный файл в этот каталог (сохраняя имена). В противном случае, если задано только два файла, то cp копирует первый файл во второй. Если задано более двух аргументов, которые не являются опциями, а последний аргумент не является именем какого-либо каталога, то это приведет к ошибке. (Так, если /a~-- это каталог, то cp -r /a /b скопирует /a в /b/a и /a/x в /b/a/x в случае, если /b уже существует, но эта же команда будет копировать /a в /b и /a/x to /b/x, если /b не существует, или же завершится с ошибкой, если /b -- обычный файл). Права доступа к файлам и каталогам будут равны тем, что были на оригинальных файлах, логически умноженными (AND) на 0777 (другими словами, в новых правах будут сброшены биты sticky, setuid и setgid -- Прим. ред.), а также с учетом umask (1) пользователя (за исключением случая, когда задана опция -p). (Но во время рекурсивного копирования каталогов, вновь создаваемые каталоги будут временно получать права, логически сложенные (OR) со значением S_IRWXU (0700), для того, чтобы разрешить чтение, запись и поиск во вновь созданных каталогах). При попытке скопировать файл сам в себя ничего происходить не будет (за исключением возможной выдачи сообщения об ошибке). Когда происходит копирование файла в другой существующий файл, то он открывается с использованием вызова open(path, O_WRONLY | O_TRUNC). Когда копирование осуществляется во вновь создаваемый файл, то он создается с использованием вызова open(path, O_WRONLY | O_CREAT, mode). Если эти вызовы завершаются неудачно, то считается, что файл существует, а чтобы cp попытался его удалить (unlink), необходимо указать опцию -f. Если удаление проходит успешно, то дальше все работает как для случая с новым файлом.

ОПЦИИ POSIX

POSIX имеет четыре с половиной опции: -f Если требуется, удаляет существующие файлы, в которые происходит копирование. (См. выше) -i Спрашивает, нужно ли перезаписывать существующие файлы, в которые происходит копирование. (Запрос выдается на стандартный вывод ошибок, а ответ читается со стандартного ввода. Копирование осуществляется только в случае положительного ответа). -p Сохраняет исходные параметры файла, такие как владелец, группа, права доступа (включая suid и sgid биты), время последней модификации и время последнего доступа к файлу. В случае, если установка владельца или группы приводит к ошибке, suid и sgid биты сбрасываются. (Заметим, что впоследствии исходный файл и его копия могут иметь разное время последнего доступа, так как операция копирования является доступом к исходному файлу). -R Копировать каталоги рекурсивно; правильно обрабатывать ситуации, когда попадаются объекты, не являющиеся обычными файлами или каталогами. (Так, копией FIFO или специального файла будет также являться FIFO или специальный файл). -r Копировать каталоги рекурсивно; выполнять какие-то, неопределенные стандартом действия, когда попадаются объекты, не являющиеся обычными файлами или каталогами. (Так, разрешается, и фактически одобряется, наличие опции -r как синонима для -R. Однако, глупое поведение, которое проявляет версия cp в GNU 4.0 не запрещается.) -- Завершает список опций.

ДОПОЛНИТЕЛЬНЫЕ ОПЦИИ POSIX 2003

Стандарт POSIX 1003.1-2003 добавляет три опции, которые определяют как управлять символьными ссылками. Когда выполняется нерекурсивное копирование, символьные ссылки разименовываются (берутся те объекты на которые они указывают, вместо самой ссылки -- прим.пер.). Когда выполняется рекурсивное копирование с использованием опции -r, результаты зависят от реализации. Когда выполняется рекурсивное копирование с использованием опции -R: -H Разименовывает символьные ссылки, указанные в списке параметров. Не разименовывает символьные ссылки, которые встречаются во время рекурсивного копирования, а просто копирует их. -L Разименовывает все символьные ссылки, как заданные в списке параметров так и встретившиеся во время рекурсивного копирования. -P Не разименовывает никакие символьные ссылки, ни заданные в списке параметров, ни встретившиеся во время рекурсивного копирования. Просто копирует их как символьные ссылки. Нет опции, работающей по умолчанию - необходимо указывать одну из опций для достижения нужного результата.

ПОДРОБНОСТИ ВЕРСИИ GNU

Обычно файлы записываются точно в том же виде, как и были прочитаны. См. ниже об опции --sparse , который является исключением. По умолчанию cp не копирует каталоги (см. опцию -r ). cp обычно отвергает копирование файла в себя же, за следующим исключением: если заданы опции --force --backup и при этом исходный файл и файл , в который осуществляется копирование, идентичны и являются обычными файлами, то cp сделает резервную копию файла: обычную или нумерованную, как скажете. Это полезно, когда вы просто хотите сделать резервную копию существующего файла, перед тем как его изменить. По умолчанию, символьные ссылки не разименовываются.

ОПЦИИ GNU

-a, --archive По возможности сохраняет структуру и атрибуты исходных файлов при копировании (но не сохраняет структуру каталогов). Эквивалентно заданию опций -dpPR . -b Смотрите обсуждение резервных копий ниже. --copy-contents (начиная с версии file-utils 4.1) В file-utils 4.0 делаются глупые вещи, попытки копировать содержимое файлов устройств и FIFO во время рекурсивного копирования. Никогда не используйте эту опцию. С ней, `cp" может просто зависнуть, читая FIFO или /dev/tty или заполнить весь диск копируя /dev/zero. -d Копирует символьные ссылки как символьные ссылки, а не файлы, на которые они указывают, и сохраняет жесткие ссылки между исходными файлами в копиях. В file-utils 4.0 длинная опция --no-dereference была синонимом для опции -d, но в file-utils 4.1 она является синонимом для опции -P, в то время как опция -d эквивалентна опциям --no-dereference --preserve=links. -f, --force Удаляет существующие файлы в случае возникновения ошибки при открытии их на чтение и никогда не спрашивает подтверждения перед тем как это сделать. (Такое поведение начинается с версии file-utils 4.1. В file-utils 4.0 эта опция была эквивалентна новой опции --remove-destination.) -H (начиная с версии file-utils 4.1) См. описание POSIX выше. -i, --interactive Спрашивает, нужно ли перезаписывать существующие обычные файлы. -l, --link Делает жесткие ссылки вместо копирования обычных файлов (не каталогов). -L, --dereference (начиная с версии file-utils 4.1) Смотрите описание POSIX выше. --no-preserve= АТРИБУТЫ (начиная с версии file-utils 4.1) Не сохраняет заданные атрибуты. См. ниже опцию --preserve. -p, --preserve Защищает оригинальные параметры файла, такие как владелец, группа, права доступа и временные штампы. --preserve= АТРИБУТЫ (начиная с версии file-utils 4.1) Здесь параметр АТРИБУТЫ может принимать одно из значений "mode" (права доступа), "ownership" (владелец и группа), "timestamps" (временные штампы), "links", "all" (всё перечисленное). -P, --no-dereference (начиная с версии file-utils 4.1) См. выше описание POSIX. Эта опция заменяет опцию -P в file-utils 4.0, которая была синонимом опции --parents. См. также опцию -d выше. --parents (начиная с версии file-utils 4.0 также -P) Формирует имя каждого копируемого файла путем добавления к имени каталога, в который осуществляется копирование, символа косой черты (/) и указанного полного имени исходного файла. Последний заданный аргумент cp должен быть именем существующего каталога. Например, команда cp --parents a/b/c existing_dir копирует файл a/b/c в existing_dir/a/b/c, создавая отсутствующие промежуточные каталоги. -r В file-utils 4.1: синоним опции -R. В file-utils 4.0: Копирует каталоги рекурсивно, копирует любые не-каталоги и не символьные ссылки (то есть FIFO и специальные файлы), как если бы они были обычными файлами. Это глупое поведение можно получить в file-utils 4.1 если указать опцию --copy-contents. -R, --recursive Копирует каталоги рекурсивно, защищая не-каталоги. --reply= HOW (начиная с версии file-utils 4.1) Здесь аргумент HOW может принимать одно из значений "yes", "no", "query", определяя какой ответ будет автоматически даваться на все вопросы: "да", "нет" или "запрос" пользователю соответственно. --remove-destination (начиная с версии file-utils 4.1) Удаляет каждый существующий (в том месте куда происходит копирование) файл, перед копированием. В версии file-utils 4.0 эта опция неявно включалась при указании опции -f. --sparse= КОГДА Разреженный (sparse) файл содержит дыры -- последовательности нулевых байт, которые не занимают физических блоков на диске; системный вызов read читает их как нули. Такой подход может как сохранить дисковое пространство, так и увеличить скорость работы, потому что многие бинарные файлы содержат много расположенных последовательно нулевых байт. По умолчанию, cp определяет дыры в исходном файле с помощью простой эвристики и делает соответствующий выходной файл также разреженным. Параметр КОГДА может принимать следующие значения: auto Поведение по умолчанию: выходной файл является разреженным, если входной файл также является разреженным. always Всегда делать выходной файл разреженным. Это полезно, когда входной файл расположен на файловой системе, которая не поддерживает разреженные файлы, а выходной файл будет располагаться на файловой системе, которая их поддерживает. never Никогда не делать выходные файлы разреженными. Если вы нашли применение для этой опции, дайте нам знать. --strip-trailing-slashes (начиная с file-utils 4.1) Удаляет все конечные символы `´ из каждого аргумента. (Это может изменить интерпретацию аргумента, если он является символьной ссылкой на каталог.) -s, --symbolic-link Делает символьные ссылки вместо копирования не-каталогов. Все имена исходных файлов должны быть полными, т. е. начинаться с символа /, за исключением случая, когда символьные ссылки будут создаваться в текущем каталоге. Эта опция генерирует сообщение об ошибке, если система не поддерживает символьные ссылки. -S Суффикс резервной копии, см. ниже. --target-directory= КАТАЛОГ (начиная с версии file-utils 4.1) Задаёт каталог назначения, куда будет осуществляться копирование. Имеется в виду для использования с xargs (1), как, например, в "ls | xargs cp --target- directory=../d". -u, --update Не копировать не-каталоги, которые уже существуют в том месте, куда осуществляется копирование, если они имеют такое же или более раннее время модификации. -v, --verbose Выводить имя каждого файла перед его копированием. -x, --one-file-system Пропускать подкаталоги, которые расположены на файловых системах, отличных от той, где начиналось копирование.

ОПЦИИ РЕЗЕРВНОГО КОПИРОВАНИЯ GNU

GNU-версии таких программ как cp , mv , ln , install и patch могут, если потребуется, делать резервные копии файлов, которые будут перезаписаны, изменены или уничтожены. При желании, резервные копии файлов создаются с помощью опции -b. Как они будут называться, задает опция -V. В случае, если имя файла резервной копии создается с помощью добавления суффикса к имени исходного файла, то суффикс указывается с помощью опции -S. -b, --backup Делать резервные копии файлов, которые будут перезаписаны или удалены. --backup= CONTROL (Начиная с версии fileutils-4.1.) -S СУФФИКС , --suffix= СУФФИКС Добавить СУФФИКС к имени файла при создании его резервной копии. Если данная опция не задана, то суффикс можно также задать, используя переменную окружения SIMPLE_BACKUP_SUFFIX Если не задана ни опция, ни переменная, то по умолчанию используется суффикс ~. -V МЕТОД , --version-control= МЕТОД Определяет, как будут называться резервные копии файлов. Аргумент МЕТОД может принимать значения numbered (или t), existing (или nil) и never (или simple). Если данная опция не задана, то будет использовано значение переменной окружения VERSION_CONTROL . Если же не задано значение и этой переменной, то по умолчанию тип резервного копирования устанавливается в existing. Данная опция соответствует переменной version-control в Emacs. Допустимыми значениями МЕТОД являются (допускаются однозначные сокращения): t , numbered Всегда делать нумерованные резервные копии файлов. nil , existing Делать нумерованные резервные копии файлов для файлов, которые уже их имеют и простые резервные копии для остальных файлов. never , simple Всегда делать простые резервные копии.

СТАНДАРТНЫЕ ОПЦИИ GNU

--help Выдать подсказку на стандартный вывод и успешно завершиться. --version Выдать информацию о версии на стандартный вывод и успешно завершиться. -- Служит для обозначения конца списка опций.

ОКРУЖЕНИЕ

При работе обычным образом используются значения переменных LANG, LC_ALL, LC_COLLATE, LC_CTYPE и LC_MESSAGES. Для GNU версии используются также переменные SIMPLE_BACKUP_SUFFIX и VERSION_CONTROL, контролирующие создание резервных копий, как описано выше.

СОВМЕСТИМОСТЬ

POSIX 1003.2

ЗАМЕЧАНИЯ

Данная страница описывает версию cp пакета fileutils-4.1; другие версии могут иметь небольшие отличия. Исправления и дополнения присылайте по адресу [email protected] . Сообщения об ошибках в этой программе присылайте по адресу [email protected] .

ПЕРЕВОД

Перевёл с английского Виктор Вислобоков 2003

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

Не всегда есть доступ к файловому менеджеру: из-за различных поломок графическая оболочка на домашнем компьютере может быть недоступна, а на серверах используется только консольный интерфейс. К тому же копирование файлов Ubuntu через терминал намного эффективнее, и вы сами в этом убедитесь. Сегодня мы рассмотрим не только обычное копирование командой cp Linux, но и не совсем обычное: с помощью tar и find .

Название утилиты 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 .

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

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

$ cp test.conf{,.bak}

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

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

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

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

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

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

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

ls -1 ~/ | egrep "" | 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 в целом. Как видите, в терминале это выполняется намного быстрее и эффективнее, чем с помощью графического интерфейса, если помнить нужные команды. Если у вас остались вопросы, спрашивайте в комментариях!

Статьи по теме: