что значит рекурсивное копирование

#!/bin/sh

Линуксоид на велосипеде с моторчиком

Рекурсивные операции с файлами в Linux

Эпиграф

— Это новый «Гарри Поттер». Я заказал версии для детей и взрослых, чтобы проверить, что в тексте нет различий.
Морис Мосс, The IT Crowd.

chmod

chown, chattr, chgrp

rm, grep

Прочие команды

Поскольку команд, в том или ином виде поддерживающих рекурсивную обработку каталогов, набралось довольно много, то я попробовал свести их в одну таблицу.

Заключение

Постскриптум

По абзацу про cp видно, что русская документация в некоторых дистрибутивах (не будем показывать пальцем на Debian и Ubuntu) не соответствует реальному положению дел. В частности, несмотря на то, что в jaunty используется GNU coreutis 6.10, русский man описывает cp версии 4.1. Желающие могут самостоятельно сравнить свою версию man 1 cp с локализованной. Другими словами, русская страница документации cp в силу своей древности вводит пользователя в заблуждение, т.е. врёт. По этой причине я рекомендую сделать apt-get remove manpages-ru.

2 комментария

> По этой причине я рекомендую сделать apt-get remove manpages-ru

Плюсую. Помню как потерял с час времени, из за феерично переведенного мана:

If from is not NULL, and the underlying protocol provides the source address, this source address is filled in.

Если параметр from не равен NULL, а сокет не является ориентированным на соединения, то адресотправителя в сообщении не заполняется.

Источник

Что значит рекурсивное копирование

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

Чтобы скопировать файл `my-copy’ в файл `neighbor-copy’, наберите:

$ cp my-copy neighbor-copy [Enter]

Чтобы сохранить все атрибуты оригинального файла, включая его время модификации, имя владельца, группу и права доступа, используйте ключ `-p’ («preserve»)(сохранить).

Чтобы скопировать файл `my-copy’ в файл `neighbor-copy’, сохранив все атрибуты исходного файла в копии, наберите:

Эта команда копирует файл `my-copy’ в новый файл `neighbor-copy’, полностью идентичный исходному по всем аспектам, кроме имени файла.

Чтобы скопировать каталог `public_html’ вместе со всеми его файлами и подкаталогами, в новый каталог `private_html’, введите:

Опция `-R’ не копирует файлы, являющиеся символической ссылкой, и не сохраняет оригинальные права доступа к файлам. Чтобы скопировать каталог рекурсивно, включая все ссылки и учитывая все права доступа, используйте опцию `-a’ («archive»). Это полезно для резервного копирования больших по объему деревьев каталогов.

Читайте также:  Что летает по небу ночью и светиться

Чтобы сделать резервную копию дерева каталогов `public_html’ в каталог `private_html’, введите:

Источник

Копирование файлов и директорий: команда cp в Linux и MacOS

Перевод статьи «Copy a Directory in Linux – How to cp a Folder in the Command Line in Linux and Unix (MacOS)».

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

Для просмотра документации или руководства по использованию команды cp выполните в терминале команду man cp :

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

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

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

Допустим, у вас есть файл a.txt и вы хотите создать его копию под именем b.txt в той же директории:

Для справки: команда ls выводит список файлов в текущей директории.

По умолчанию команда cp использует в качестве пути к файлам вашу текущую директорию.

Как скопировать файл в другую директорию

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

После выполнения команды cp ранее пустая directory-1 содержит файл a.txt.

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

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

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

В этом примере оба файла (first.txt и second.txt) были скопированы в директорию directory-1.

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

Как скопировать одну директорию в другую

Если вы попытаетесь передать команде cp в качестве источника имя директории, вы получите ошибку:

В следующем примере у нас есть две директории (directory-1 и directory-2), расположенные в нашей текущей директории. В directory-1 есть файл a.txt. Мы рекурсивно копируем directory-1 в directory-2. После этого в нашей текущей директории по-прежнему есть directory-1 и directory-2, при этом в directory-2 есть копия directory-1, содержащая файл a.txt.

Читайте также:  эпиааккорона или спутник что лучше

Копирование директории целиком и копирование всего содержимого из директории

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

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

Для пользователей Linux: после слэша нужно добавить точку. Если хотите почитать более подробно, вот хорошая статья на Хабре.

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

По умолчанию команда cp перезаписывает существующие файлы. Для примера создадим в текущей директории файл a.txt с текстом A, а в директории directory-1 — файл a.txt с текстом B. При копировании файла a.txt из текущей директории в directory-1 файл a.txt перезаписывается (в его содержимом было B, стало A).

Примечание: команда cat среди прочего служит для вывода содержимого файлов на экран.

Есть два способа предотвратить перезапись файлов.

Флаг —interactive

Флаг —no-clobber

Другие опции

Источник

Как правильно скопировать файлы и папки исключая некоторые из них

Топик написан в ответ на похожий.

Автор оригинального топика предлагает решить задачу в лоб — а именно, скопировать все файлы а потом удалить не нужные. Это может быть неплохим решением, если вам, конечно, не нужно скопировать всю домашнюю папку на флешку, за исключением вашей коллекции видео.

Но главная проблема этого подхода в другом — он не соответствует идеологии unix: сложные задачи решаются комбинацией простых утилит.

Под катом подробности о методах решения этого класса задач — не рассматривайте это как готовый рецепт.

0. Декомпозиция

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

1. Получение списка файлов

Обычно мы просматриваем список файлов программой ls. Её вывод выглядит примерно так:

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

Следующая программа, которая приходит на ум — find

Читайте также:  чем любит заниматься микки маус

Уже лучше но в вывод попали и директории, а они нам не нужны. Попробуем так:

Вот то, что там нужно. Список файлов.

2. Фильтрация

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

Хорошо, но в условиях задачи стоит исключать файлы, так что немного поменеяем наш конвейер

Первые две части выполнены.

3. Копирование

Из man-страницы для команды cp мы можем узнать, что исходный файл нужно передавать программе cp в качестве аргумента, а мы пока можем только перенаправить список на стандартный ввод.
Применим утилиту xargs — она принимает стандартный ввод и вызывает указанную программу с параметрами из стандартного ввода. Итак:

Можно считать, что задача решена.

Вместо заключения

Я надеюсь что это описание поможет правильно подходить к решению как таких простых так и более комплексных задач.

Источник

Когда бы я не хотел такого поведения при копировании каталога?

Разве рекурсивная копия каталога не является поведением по умолчанию; поведение мы хотим почти все время?

Такое ощущение, что это лишний флаг.

Итак, с точки зрения командной строки, делая это:

Теперь о том, почему это может показаться излишним или избыточным, это действительно сводится к историческим методам работы с файловыми системами. А также создание системы, которая защищена от всех типов ошибок, связанных с пользователем; случайный, а также преднамеренный.

То есть, допустим, у вас есть

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

Точно так же именно поэтому файловые системы Linux / Unix не имеют 777 разрешений и sudo прав, установленных по умолчанию, и то, как настоящие системные администраторы вздрагивают, когда пользователь устанавливает 777 разрешения или предоставляет всем sudo права. Это основные вещи, которые нужно сделать, чтобы система была стабильной и как можно более «пользовательской»; любой, кто поспешит заморозить эти соглашения, скорее всего, нанесет ущерб их системе, даже не подозревая об этом.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Другой ответ здесь, на сайте Unix Stack Exchange, дает хорошее объяснение того, почему нерекурсивная копия каталога является проблематичной; Акцент мой.

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

Источник

Библиотека с советами