- Как копировать файлы и каталоги в Linux
- Копирование файлов с помощью команды cp
- Скопируйте файл в каталог
- Копировать несколько файлов
- Копирование каталогов с помощью команды cp
- Копирование файлов и каталогов с помощью команды rsync
- Выводы
- Копирование по списку. Как?
- Re: Копирование по списку. Как?
- Re: Копирование по списку. Как?
- Re: Копирование по списку. Как?
- Re: Копирование по списку. Как?
- Re: Копирование по списку. Как?
- Re: Копирование по списку. Как?
- Re: Копирование по списку. Как?
- Re: Копирование по списку. Как?
- Re: Копирование по списку. Как?
- Re: Копирование по списку. Как?
- Re: Копирование по списку. Как?
- Re: Копирование по списку. Как?
- Re: Копирование по списку. Как?
- Re: Копирование по списку. Как?
- Re: Копирование по списку. Как?
- Re: Копирование по списку. Как?
- Команда cp: правильное копирование папок с файлами в *nix
- Выводы
- Послесловие
- Как правильно скопировать файлы и папки исключая некоторые из них
- 0. Декомпозиция
- 1. Получение списка файлов
- 2. Фильтрация
- 3. Копирование
- Вместо заключения
Как копировать файлы и каталоги в Linux
Копирование файлов и каталогов — одна из наиболее распространенных задач, которые вы будете выполнять при работе в командной строке. В Linux есть несколько команд для копирования файлов, наиболее широко используемые инструменты — cp и rsync .
Обычной практикой является использование команды cp для копирования файлов и rsync для копирования каталогов.
Чтобы иметь возможность копировать файлы и каталоги, у вас должны быть как минимум права на чтение исходного файла и права записи в целевой каталог.
Копирование файлов с помощью команды cp
В операционных системах Linux и Unix команда cp используется для копирования файлов и каталогов.
Самый простой вариант использования — скопировать файл в текущий рабочий каталог. Например, чтобы скопировать файл с именем file.txt в файл с именем file_backup.txt в текущем каталоге , вы должны выполнить следующую команду:
Если целевой файл существует, он будет перезаписан. Чтобы получить запрос на подтверждение перед перезаписью файлов, используйте параметр -i .
По умолчанию при использовании команды cp для копирования файла новый файл будет принадлежать пользователю, выполняющему команду. Используйте параметр -p чтобы сохранить режим файла, владельца и временные метки :
Другой вариант, который может быть полезен, — это -v . При использовании этой опции команда печатает, что делается:
Скопируйте файл в каталог
Чтобы скопировать файл в каталог, укажите абсолютный или относительный путь к каталогу. Если целевой каталог не указан, файл копируется в текущий каталог.
В следующем примере мы file.txt файл file.txt в file.txt /backup :
При указании в качестве места назначения только имени каталога скопированный файл будет иметь то же имя, что и исходный файл.
Если вы хотите скопировать файл под другим именем, вам необходимо указать желаемое имя файла:
Приведенная выше команда скопирует файл в указанный каталог как new_file.txt .
Копировать несколько файлов
Чтобы скопировать сразу несколько файлов и каталогов, укажите имена исходных файлов и каталогов, за которыми следует каталог назначения в качестве последнего аргумента:
При копировании нескольких файлов местом назначения должен быть каталог.
Команда cp также позволяет использовать сопоставление с образцом. Например, чтобы скопировать все файлы .png из текущего каталога в каталог /backup , вы должны использовать:
Копирование каталогов с помощью команды cp
Чтобы скопировать каталог, включая все его файлы и подкаталоги, используйте параметр -R или -r . В следующем примере мы копируем каталог Pictures в Pictures_backup :
Приведенная выше команда создаст каталог назначения и рекурсивно скопирует все файлы и подкаталоги из источника в каталог назначения.
Если целевой каталог уже существует, сам исходный каталог и его содержимое копируются в целевой каталог. Чтобы скопировать только файлы и подкаталоги, но не целевой каталог, используйте параметр -T :
Параметры, используемые при копировании файлов, также могут использоваться при копировании каталогов. Основное отличие состоит в том, что при копировании каталогов необходимо использовать параметр -R .
Копирование файлов и каталогов с помощью команды rsync
rsync — это быстрая и универсальная утилита командной строки, которая синхронизирует файлы и каталоги между двумя местоположениями. Его можно использовать для копирования файлов в локальные и удаленные места.
rsync включает множество параметров, которые контролируют каждый аспект его поведения.
Наиболее полезная опция -a которая рекурсивно копирует каталоги, передает специальные и блочные устройства и сохраняет символические ссылки, время модификации, группу, владение и разрешения.
Чтобы скопировать один файл из одного места в другое, вы должны выполнить следующую команду:
Если целевой файл существует, rsync перезапишет его.
Эту же команду можно использовать для копирования каталога:
rsync по-разному rsync исходным каталогам, заканчивающимся косой чертой / . Если вы добавите завершающую косую черту в исходный каталог, команда скопирует только содержимое исходного каталога в целевой каталог. Если косая черта в конце опущена, rsync скопирует исходный каталог в целевой каталог. Самый безопасный вариант — всегда включать косую черту / как в месте назначения, так и в источнике.
Чтобы узнать больше о rsync прочтите следующие статьи:
Выводы
Мы показали вам, как копировать файлы и каталоги в системах на базе Linux и Unix, используя утилиты cp и rsync .
Если у вас есть вопросы, оставьте комментарий ниже.
Источник
Копирование по списку. Как?
Задача: надо скопировать из локального репозитория на 4-х DVD только указанные в списке файлы, в одну папку. Буду очень признателен за помощь.
Re: Копирование по списку. Как?
Что-то типа такого:
cat
| while read file_name; do echo «$file_name» ; done
cat
| xargs -d «\n» cp —target-directory=
— список файлов
— директория в которую нужно скопировать.
Re: Копирование по списку. Как?
Re: Копирование по списку. Как?
Туго соображаю, но думаю на перле чего нибудь обязательно.
Re: Копирование по списку. Как?
cpio -p /directory ★★★★★ ( 20.09.07 07:59:25 )
Re: Копирование по списку. Как?
если в file.list в одной строке будет несколько файлов — не сработает(
Re: Копирование по списку. Как?
господа, не забываем про экранирование.
Re: Копирование по списку. Как?
cat /home/leo/Desktop/installed_programs.txt | while read file_name; do echo «$file_name» /media/hdb1/repo_copy_without_dir; done
zlib1g-dev. install /media/hdb1/repo_copy_without_dir
cat /home/leo/Desktop/installed_programs.txt | xargs -d «\n» cp —target-directory=/media/hdb1/repo_copy_without_dir
cp: невозможно выполнить stat для `zlib1g-dev\t\t\t\t\tinstall’: No such file or directory
Re: Копирование по списку. Как?
xargs -i cp <> dir ★★★★★ ( 20.09.07 14:14:45 )
Re: Копирование по списку. Как?
Обе команды были расчитаны на то, что файл содержит по одному имени файла на строку, например:
file name 1.txt
file name 2.mp3
.
file name N.XXX
Если формат твоего списка отличается то его нужно либо привести к такому виду, как вверху, либо изменить сами команды.
Вообщем:
man awk
и не забывай про относительные пути.
PS: Обе команды пробелы в файлах должны воспринимать нормально (покрайней мере у меня воспринемают нормально).
Re: Копирование по списку. Как?
> cat
| while read file_name; do echo «$file_name» ; done
Ой, вместо echo должно быть cp. Тоесть так:
cat
| while read file_name; do cp «$file_name» ; done
Re: Копирование по списку. Как?
Друзья, попробовал все приведенные команды с разными вариантами списка, — результат = 0, как приводил выше. Делал список только из одного файла без пробелов. Думаю список не виноват. Команды давал от имени sudo из директории /media/hdb1/repo, где лежат в папках те самые пакеты. Соответственно указывал на список так /media/hdb1/repo/list.txt. Пробовал делать список без расширения .txt. Ошибка наверняка пустячная, вот только где? Пробовал читать ман — слишком сложно.
Re: Копирование по списку. Как?
> Ошибка наверняка пустячная, вот только где?
Если результат как выше, то в твоем «списке».
Вообще сделай на всякий cd /media/hdb1/repo && sudo cp `cat list.txt` /to/dir и скажи какую ошибку выдает.
> где лежат в папках те самые пакеты
не совсем понял, т.е. каждый пакет лежит в /media/hdb1/repo/somefolder/ ?
Ну покажи несколько строчек (не забудь выбрать при постинге Preformatted text) или лучше выложи его целиком куда-нибудь.
Re: Копирование по списку. Как?
Re: Копирование по списку. Как?
Re: Копирование по списку. Как?
Конечно же файлы в списке должны бы быть с относительными путями до них, т.к. все вышеуказанные команды искали их в текущей директории, но вот на вскидку обход этой проблемы (выполняться будет долго из-за поиска каждого файла):
for i in `cat list.txt`; do find . -name «$» -exec cp ‘<>‘ /TO/DIR/ \;; done
Ну и, понятно, имена файлов в списке должны быть полными, т.е. с расширениями .deb
Тут также подрузамевается, что в репозитории Деба не кладут файлы с пробелами в имени.
Так как DVD четыре, можно после done припаять ;eject, чтобы дисковод выезжал после того, как всё файло с данного DVD скопируется.
Re: Копирование по списку. Как?
Да, про eject ступил, надо сначала из директории выйти, а то будет device is busy
Источник
Команда 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 вызовет ошибку.
Однако, если в папке тысячи файлов и больше, то от подхода с использованием wildcards стоит отказаться вовсе. Дело в том, что bash разворачивает wildcards в очень длинную командную строку наподобие:
На длину командной строки есть ограничение, которое мы можем узнать используя команду:
Получим максимальную длину командной строки в байтах:
Получим что-то типа:
Итак, давайте будем обходиться вовсе без 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 имеет значение. Если перепутать, то получите полную белиберду: направление копирования поменяется.
Благодарности:
Источник
Как правильно скопировать файлы и папки исключая некоторые из них
Топик написан в ответ на похожий.
Автор оригинального топика предлагает решить задачу в лоб — а именно, скопировать все файлы а потом удалить не нужные. Это может быть неплохим решением, если вам, конечно, не нужно скопировать всю домашнюю папку на флешку, за исключением вашей коллекции видео.
Но главная проблема этого подхода в другом — он не соответствует идеологии unix: сложные задачи решаются комбинацией простых утилит.
Под катом подробности о методах решения этого класса задач — не рассматривайте это как готовый рецепт.
0. Декомпозиция
Решение любой комплексной задачи начинается с разбора её на составные части. Итак нам нужно скопировать некоторый набор файлов предварительно его отфильтровав.
Значит — получение списка файлов, фильтрация, копирование.
1. Получение списка файлов
Обычно мы просматриваем список файлов программой ls. Её вывод выглядит примерно так:
Подходит ли там такой вывод? Нет, потому, что в нем недостаточно информации — нам нужно копировать файлы рекурсивно, значит для нас было-бы гораздо удобнее если первая в нашей цепочке программа выдала там имена файлов вместе с путями.
Следующая программа, которая приходит на ум — find
Уже лучше но в вывод попали и директории, а они нам не нужны. Попробуем так:
Вот то, что там нужно. Список файлов.
2. Фильтрация
Этот список файлов нужно отфильтровать. Перенаправим вывод нашей предыдущей комманды в программу grep.
Хорошо, но в условиях задачи стоит исключать файлы, так что немного поменеяем наш конвейер
Первые две части выполнены.
3. Копирование
Из man-страницы для команды cp мы можем узнать, что исходный файл нужно передавать программе cp в качестве аргумента, а мы пока можем только перенаправить список на стандартный ввод.
Применим утилиту xargs — она принимает стандартный ввод и вызывает указанную программу с параметрами из стандартного ввода. Итак:
-n 1 значит, что только одна строка из стандартного ввода подставляется в комманду, а -I % — определяет символ, который будет заменен в целевой комманде на строчку из стандартного ввода. В нашем случае это будет
Можно считать, что задача решена.
Вместо заключения
Я надеюсь что это описание поможет правильно подходить к решению как таких простых так и более комплексных задач.
Хочется отметить, что
- Это топик способах решения задач и немного о применении конвейера, а не о копировании файлов
- Этот способ далеко не едиственный и даже не самый короткий, а наиболее наглядный для демонстрации методологии решения.
- В случае этой конкретной задачи будет быстрее воспользоваться find ./ -type f ! -name «*2*» -exec cp —parents -t /target/dir «<>» \+
- Лично я воспользовался-бы tar —exclude=2 -cf — ./ | ( cd /path/to/dest/ && tar -xvf — )
- Т.к. это первый мой топик, буду рад конструктивной критике
Источник