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

Содержание
  1. Как копировать файлы и каталоги в Linux
  2. Копирование файлов с помощью команды cp
  3. Скопируйте файл в каталог
  4. Копировать несколько файлов
  5. Копирование каталогов с помощью команды cp
  6. Копирование файлов и каталогов с помощью команды rsync
  7. Выводы
  8. Копирование по списку. Как?
  9. Re: Копирование по списку. Как?
  10. Re: Копирование по списку. Как?
  11. Re: Копирование по списку. Как?
  12. Re: Копирование по списку. Как?
  13. Re: Копирование по списку. Как?
  14. Re: Копирование по списку. Как?
  15. Re: Копирование по списку. Как?
  16. Re: Копирование по списку. Как?
  17. Re: Копирование по списку. Как?
  18. Re: Копирование по списку. Как?
  19. Re: Копирование по списку. Как?
  20. Re: Копирование по списку. Как?
  21. Re: Копирование по списку. Как?
  22. Re: Копирование по списку. Как?
  23. Re: Копирование по списку. Как?
  24. Re: Копирование по списку. Как?
  25. Команда cp: правильное копирование папок с файлами в *nix
  26. Выводы
  27. Послесловие
  28. Как правильно скопировать файлы и папки исключая некоторые из них
  29. 0. Декомпозиция
  30. 1. Получение списка файлов
  31. 2. Фильтрация
  32. 3. Копирование
  33. Вместо заключения

Как копировать файлы и каталоги в 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 .

Читайте также:  Передача файлов по wifi linux

Копирование файлов и каталогов с помощью команды 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/ ?

Читайте также:  Режим бога для windows

Ну покажи несколько строчек (не забудь выбрать при постинге 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?

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

Читайте также:  Обновление sp1 для windows 10 x64

Те кто хорошо знаком с 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 — )
  • Т.к. это первый мой топик, буду рад конструктивной критике

Источник

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