Скопировать файл linux консоль

Копирование файлов в Linux

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

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

Копирование файлов в Linux

1. Команда cp

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

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

cp ~/pic.png ~/pictures/

Можно явно указать имя нового файла:

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

Для копирования папок нужно использовать опцию -r:

cp -r ~/reports ~/documents

После выполнения этой команды копирования папка reports будет скопирована в папку ~/documents. Если же вы хотите чтобы только содержимое папки reports было скопировано папку ~/documents используйте опцию -T:

cp -rT ~/reports ~/documents

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

cp ~/reports/april* ~/documents

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

cp -p ~/reports/march* ~/documents/

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

cp /etc/passwd

В данном случае будет создан файл с таким же именем и расширением .back.

По умолчанию в cp не отображает прогресс копирования файла, что очень неудобно при работе с большими файлами. Но утилита progress позволяет посмотреть прогресс для всех утилит из пакета coerutils. Или же вы можете использовать команду rsync.

2. Команда rsync

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

Читайте также:  Войти в рут линукс

Для того чтобы скопировать ту же картинку в папку ~/pictures используйте такую команду:

Указать имя для нового файла можно так же как и с cp. Ещё с помощью этой утилиты довольно удобно копировать больше файлы, потому что она умеет отображать прогресс копирования. Для этого нужно использовать опцию —progress:

rsync —progress ~/disk.img ~/images

Если вы хотите скопировать содержимое одной папки в другую, то нужно использовать опцию -r для копирования папок:

rsync -r ~/reports/ ~/documents/

Но обратите внимание, что для того чтобы копировать именно содержимое из папки источника, её название должно заканчиваться на слеш. Ну а для того чтобы скопировать саму папку не нужно добавлять в конце слеш:

rsync -r ~/reports ~/documents/

Если вы хотите сохранить права на файл и его владельца, то нужно использовать опцию -a:

rsync -a ~/reports ~/documents/

3. Команда xcp

В последнее время для многих утилит из набора CoreUtils появились аналоги, переписанные на Rust, которые лучше оптимизированы для современных систем и более дружелюбны к пользователю. В качестве такой альтернативы для cp можно использовать команду xcp. Для её установки надо использовать cargo:

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

xcp ~/pic.png ~/pictures/

Также работает копирование файла с указанием нового имени:

xcp ~/pic.png ~/pictures/wallpaper.png

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

xcp -r ~/reports ~/documents/

Если же нужно скопировать папку ~/reports в ~/documents, то нужно использовать опцию -T:

xcp -rT ~/reports ~/documents/

Теперь вы знаете основные команды, которые могут помочь выполнить копирование файлов Linux. Дальше, давайте рассмотрим как фильтровать файлы для копирования по регулярным выражениям.

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

Иногда может возникнуть необходимость выбрать файлы для копирования по регулярному выражению. В этом может помочь команда find. Она позволяет применять различные условия и регулярные выражения для поиска файлов, а потом ко всем найденным файлам можно применить cp, rsync или xcp.

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

find ./reports -regex ‘\./[^\/]*\/5*’ -exec cp <> ~/documents \;

Параметр regex здесь задает регулярное выражение. Обратите внимание, что регулярное выражение применяется не к имени файла, а ко всему пути. Параметром exec указывает, какую команду нужно выполнить для обнаруженных файлов. Символ <> — подставляет имя каждого файла. Аналогичным образом можно использовать другие способы фильтрации find.

Читайте также:  Red hat enterprise linux technical overview rh024

Дополнительные способы копирования файлов в Linux

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

cat report > ~/reports/report

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

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

Эта команда полностью копирует содержимое папки /var в папку /mnt/var. Так вы можете копировать папку Linux, причём абсолютно любую или даже целую операционную систему. Утилита cp тоже может справиться с такой задачей, если указать опцию -a.

Выводы

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

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Источник

Команда cp: правильное копирование папок с файлами в *nix

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

Допустим нам нужно скопировать всё из папки /source в папку /target.

Первое, что приходит на ум это:

Сразу исправим эту команду на:

Ключ -a добавит копирование всех аттрибутов, прав и добавит рекурсию. Когда не требуется точное воспроизведение прав достаточно ключа -r .

После копирования мы обнаружим, что скопировались не все файлы — были проигнорированы файлы начинающиеся с точки типа:

.profile
.local
.mc
и тому подобные.

Потому что wildcards обрабатывает shell ( bash в типовом случае). По умолчанию bash проигнорирует все файлы начинающиеся с точек, так как трактует их как скрытые. Чтобы избежать такого поведения нам придётся изменить поведение bash с помощью команды:

Чтобы это изменение поведения сохранилось после перезагрузки, можно сделать файл wildcard.sh c этой командой в папке /etc/profile.d (возможно в вашем дистрибутиве иная папка).

А если в директории-источнике нет файлов, то shell не сможет ничего подставить вместо звёздочки, и также копирование завершится с ошибкой. Против подобной ситуации есть опции failglob и nullglob . Нам потребуется выставить failglob , которая не даст команде выполниться. nullglob не подойдёт, так как она строку с wildcards не нашедшими совпадения преобразует в пустую строку (нулевой длины), что для cp вызовет ошибку.

Читайте также:  Linux переключение между окнами терминала

Однако, если в папке тысячи файлов и больше, то от подхода с использованием wildcards стоит отказаться вовсе. Дело в том, что bash разворачивает wildcards в очень длинную командную строку наподобие:

cp -a /souce/a /source/b /source/c …… /target

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

Получим максимальную длину командной строки в байтах:

…. Maximum length of command we could actually use: 2089314 ….

Итак, давайте будем обходиться вовсе без wildcards.

И тут мы столкнёмся с неоднозначностью поведения cp . Если папки /target не существует, то мы получим то, что нам нужно.

Однако, если папка target существует, то файлы будут скопированы в папку /target/source.

Не всегда мы можем удалить заранее папку /target, так как в ней могут быть нужные нам файлы и наша цель, допустим, дополнить файлы в /target файлами из /source.

Если бы папки источника и приёмника назывались одинаково, например, мы копировали бы из /source в /home/source, то можно было бы использовать команду:

И после копирования файлы в /home/source оказались бы дополненными файлами из /source.

Такая вот логическая задачка: мы можем дополнить файлы в директории-приёмнике, если папки называются одинаково, но если они отличаются, то папка-исходник будет помещена внутрь приёмника. Как скопировать файлы из /source в /target с помощью cp без wildcards?

Чтобы обойти это вредное ограничение мы используем неочевидное решение:

Те кто хорошо знаком с DOS и Linux уже всё поняли: внутри каждой папки есть 2 невидимые папки «.» и «..», являющиеся псевдопапками-ссылками на текущую и вышестоящие директории.

  • При копировании cp проверяет существование и пытается создать /target/.
  • Такая директория существует и это есть /target
  • Файлы из /source скопированы в /target корректно.

Поведение этой команды однозначно. Всё отработает без ошибок вне зависимости от того миллион у вас файлов или их нет вовсе.

Выводы

Если нужно скопировать все файлы из одной папки в другую, не используем wildcards, вместо них лучше использовать cp в сочетании с точкой в конце папки-источника. Это скопирует все файлы, включая скрытые и не завалится при миллионах файлов или полном отсутствии файлов.

Послесловие

vmspike предложил аналогичный по результату вариант команды:

ВНИМАНИЕ: регистр буквы T имеет значение. Если перепутать, то получите полную белиберду: направление копирования поменяется.
Благодарности:

  • Компании RUVDS.COM за поддержку и возможность публикации в своем блоге на Хабре.
  • За изображение TripletConcept. Картинка очень большая и детальная, можно открыть в отдельном окне.

Источник

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