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

А зачем цикл по extenions? Смотря в каком моменте вы хотите копировать файлы там и вставляйте. И что за переменная found? Directory.GetFiles(path, pattern, SearchOption.AllDirectories) не вернет вам все файлы из вложенных директорий.

17 ноя 2016 в 9:07

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Создаете массив с расширениями, в цикле пробегаетесь по нему и ищите файлы с нужным расширением, дальше пробегаетесь в цикле по всем найденным файлам одного расширения и копируете по одному в нужную директорию, в моем случае копирование из D:files в D:filescopied

Отслеживать
ответ дан 17 ноя 2016 в 9:26
3,586 4 4 золотых знака 20 20 серебряных знаков 43 43 бронзовых знака

Еще можно убрать цикл по extensions , заменив поиск файлов на Directory.EnumerateFiles(path, «*.*», SearchOption.AllDirectories) .Where(s => extensions.Any(e => s.EndsWith(e))

17 ноя 2016 в 9:51

Спасибо Вам за примеры, буду вникать, так же хотелось узнать на .Net 2.0 выше способ ускорить возможно?

Копирование файла из директории в директорию в терминале Ubuntu

17 ноя 2016 в 10:00
17 ноя 2016 в 10:28
17 ноя 2016 в 10:36
17 ноя 2016 в 11:52

Для начала сделаем метод для поиска файлов по маске. Работает с .NET 4.0 и быстрее, чем Directory.GetFiles :

public static IEnumerable nGetFiles(string path, string searchPatternExpression = «», SearchOption searchOption = SearchOption.AllDirectories) < Regex reSearchPattern = new Regex(searchPatternExpression); return Directory.EnumerateFiles(path, «*», searchOption).Where(file =>reSearchPattern.IsMatch(Path.GetFileName(file))); >

В результате будут просканированы все файлы в папке SourcePath и ее подпапках, найденные файлы, соответствующие искомым расширениям будут скопированы в TargetPath без сохранения структуры подпапок. Более того, если есть файл D:SourceDirtest.asp и есть файл D:SourceDir111test.asp , то в результирующей папке D:TargetPath будет только один из этих файлов, который будет копироваться последним (он и перезатрёт существующий, и скопированный первым в целевую папку файл).

Если же нужно скопировать файлы из папки с сохранением структуры вложенных папок и файлов, то вот тут уже давал ответ.

Источник: ru.stackoverflow.com

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

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

Для копирования файлов или директорий (папок) в Unix-подобных операционных системах (Linux и MacOS) используется команда cp .

КАК СКОПИРОВАТЬ ФАЙЛ ИЗ ПАПКИ в ПАПКУ

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

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

$ man cp NAME cp — copy files SYNOPSIS cp [OPTIONS] source_file target_file cp [OPTIONS] source_file . target_directory .

Примечание редакции Techrocks. Также для получения справки можно воспользоваться командой cp —help .

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

cp [OPTIONS] source_file target_file

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

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

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

$ ls a.txt $ cp a.txt b.txt $ ls a.txt b.txt

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

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

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

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

$ ls ../directory-1/ $ cp a.txt ../directory-1/ $ ls ../directory-1/ a.txt

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

Примечание редакции Techrocks. В примере показан относительный путь к директории. Две точки перед слэшем означают «родительская директория». Допустим, ваша текущая директория — directory-2, которая находится в директории parent_directory. Команда ls ../directory-1/ выведет список файлов в directory-1, которая тоже находится в parent_directory.

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

Читайте также:
Определение семантики и синтаксиса языка разработка структуры программы

$ cp a.txt ../directory-1/b.txt $ ls ../directory-1/ b.txt

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

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

$ ls ../directory-1/ $ cp first.txt second.txt ../directory-1/ $ ls ../directory-1/ first.txt second.txt

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

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

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

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

$ cp directory-1 directory-2 cp: directory-1 is a directory (not copied).

Для копирования директории целиком нужно добавить флаг -r (или -R , или —recursive ), указывающий, что копировать надо рекурсивно:

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

$ ls directory-1 directory-2 $ ls directory-1 a.txt $ ls directory-2 $ cp -r directory-1 directory-2 $ ls directory-2 directory-1 $ ls directory-2/directory-1 a.txt

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

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

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

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

Вот описание опции -R в мануале ( man ):

Если файл_источник является директорией, cp копирует директорию и все поддерево, подключенное к этой точке. Если файл_источник заканчивается на / , копируется содержимое этой директории, а не сама директория.

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

$ ls directory-1 a.txt $ cp -r directory-1/ directory-2 $ ls directory-1 directory-2 $ ls directory-2 a.txt

Если вы хотите скопировать всю папку вместе со всем ее содержимым, не добавляйте в конце слэш / .

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

$ ls directory-1 a.txt $ cp -r directory-1/. directory-2 $ ls directory-1 directory-2 $ ls directory-2 a.txt

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

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

$ cat a.txt A $ cat directory-1/a.txt B $ cp a.txt directory-1/a.txt $ cat directory-1/a.txt A

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

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

Флаг —interactive

Чтобы при возможной перезаписи получить предупреждение, можно добавить к команде cp флаг -i (или —interactive):

$ cp -i a.txt directory-1/a.txt overwrite directory-1/a.txt? (y/n [n])

Флаг —no-clobber

Флаг -n (или —no-clobber ) позволяет предотвращать перезапись по умолчанию, не спрашивая пользователя:

$ cat a.txt A $ cat directory-1/a.txt B $ cp -n a.txt directory-1/a.txt $ cat directory-1/a.txt B

На этом примере видно, что благодаря флагу -n содержимое файла directory-1/a.txt не было перезаписано.

Другие опции

Команде cp можно передавать много других полезных опций. Например, -v для «многословного» вывода или -f для «принудительного» выполнения. Я советую почитать страницу man , чтобы хотя бы знать, какие есть варианты.

Источник: techrocks.ru

Команда cp в Linux

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

В этой статье мы рассмотрим что представляет из себя эта утилита, её синтаксис, основные опции, а также несколько примеров использования.

Синтаксис и опции cp в Linux

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

$ cp опции /путь/к/файлу/источнику /путь/к/файлу/назначения

И копирование файла с сохранением его имени в указанную папку:

$ cp опции /путь/к/файлу/источнику /путь/к/директории/назначения

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

Утилита имеет несколько интересных опций, которые могут сильно помочь при нестандартных задачах копирования, поэтому давайте их рассмотрим:

  • —attributes-only — не копировать содержимое файла, а только флаги доступа и владельца;
  • -b, —backup — создать резервную копию файла назначения если он существует;
  • —copy-contents — копировать содержимое для специальных файлов (сокеты, файлы устройств);
  • -f, —force — удалить файл назначения перед попыткой записи в него если он существует;
  • -i, —interactive — спрашивать, нужно ли перезаписывать существующие файлы;
  • -n, —no-clobber — не перезаписывать существующие файлы;
  • -P, —no-dereference — копировать сами символические ссылки, а не то на что они указывают;
  • -L, —dereference — копировать не символические ссылки, а то, на что они указывают;
  • -l, —link — создавать жесткие ссылки вместо копирования;
  • —preserve — переносить указанные атрибуты с файла источника в файл назначения, возможные значения: mode, ownership, time‐stamps, context, links, xattr, all;
  • —no-preserve — не переносить указанные атрибуты;
  • —parents — сохранять путь, указанный в файле источнике, в папке назначения;
  • -r, —recursive — копировать папку Linux рекурсивно;
  • —reflink — использовать Copy on Write если это поддерживается файловой системой;
  • -s, —symbolic-link — не выполнять копирование файлов в Linux, а создавать символические ссылки;
  • -S, —suffix — указать суффикс для резервных копий файлов;
  • —sparse — настройка работы с разреженными файлами;
  • -t, —target-directory — считать файл-назначения директорией и копировать файл-источник или директорию-источник в эту директорию с оригинальным именем;
  • -T, —no-target-directory — считать директорию назначения файлом или директорией для записи данных. Если в качестве источника выбран файл, то он будет скопирован с новым именем. Если директория, то её содержимое будет скопировано в директорию назначения;
  • -u, —upgrade — скопировать файл, только если он был изменён;
  • -x, —one-file-system — рекурсивное копирование не должно выходить за пределы этой файловой системы;
  • -v, —verbose — максимально подробный вывод.
Читайте также:
App cash отзывы о программе

Кроме перечисленных выше опций, существуют опции, которые объединяют в себе несколько других с определёнными значениями. Во основные из них:

  • -p — сохранять владельца, временные метки и флаги доступа при копировании, аналогично —preserve=mode,ownership,timestamps;
  • -d — копировать символические и жесткие ссылки именно как ссылки, аналогично —no-dereference —preserve=links;
  • -a — режим резервного копирования, при котором сохраняются все атрибуты, ссылки, а также выполняется резервное копирование папок, аналогично —recursive —preserve=all, —no-dereference;

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

Примеры использования cp

Для примеров из этой статьи я создам несколько файлов file1, file2, file3, одну символическую ссылку link1 на файл file1 и жесткую ссылку на файл file3. Затем папку source и в ней file4, file5, file6 и папку destination. Вот так можно создать ссылки:

ln -s $(realpath file1) link1 ln file3 hlink1

В результате получится такая структура:

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

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

cp file1 destination/file10

Таким же способом можно создать копию файла в той же папке.

2. Копирования файла в папку

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

cp file1 destination/

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

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

Для копирования папок нужно использовать опцию -r (—recursive). Скопировать одну папку в другую довольно просто, если папка назначения существует. Для того чтобы скопировать папку source в папку destination выполните команду:

cp -r source destination

Или можно явно указать, что нужно именно скопировать source в destination с помощью опции -t:

cp -t file1 destination

Тогда, если папка destination не существует вы получите ошибку, вместо не очевидного поведения.

4. Копирование содержимого папки в папку

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

cp -r source destination1/

Если папка назначения существует, то в ней будет создана папка source. Для того чтобы избежать такого поведения можно использовать опцию -T:

cp -rT source destination/

Или же можно явно указать, что вас интересует именно копирование содержимого папки с помощью символа *. Например:

cp source/* destination

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

5. Обработка существующих файлов

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

Читайте также:
Как с другого компьютера управлять в моем программа

cp -i file1 destination

С помощью опции -n можно никогда не перезаписывать существующие файлы:

cp -n file1 destination

Кроме того, для существующих файлов можно делать резервную копию с помощью опции -b или —backup. Например, если использовать опцию -b, то в конце названия файла резервной копии будет добавлен символ тильды ~:

cp -b file1 destination

При использовании опции —backup можно настроить имя резервной копии, Вот доступные варианты:

  • none — резервная копия не делается;
  • numbered — к имени файла будет добавляться номер;
  • simple — в конец файла будет добавлен знак ~;
  • existing — если в директории назначения уже есть резервные копии, то будет использоваться такой же тип именования как и у них.

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

cp —backup=numbered file1 destination

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

cp -u source/* destination

6. Копирование ссылок

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

cp -P link1 destination

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

cp —preserve=links hlink1 destination

7. Сохранение атрибутов при копировании

По умолчанию cp обновляет временные метки и атрибуты прав доступа файлов при копировании. Но иногда может возникнуть необходимость сохранить оригинальные значения атрибутов. Для этого можно использовать опцию —preserve. Вот её возможные параметры:

  • mode — права доступа, сюда входит чтение, запись, выполнение и дополнительные флаги;
  • ownership — владелец и группа;
  • time‐stamps — временные метки, такие как дата обновления, дата создания и дата последнего доcтупа;
  • context — контекст SELinux;
  • links — сохранение жестких ссылок;
  • xattr — дополнительные атрибуты, которые настраиваются с помощью команды chattr;
  • all — всё выше перечисленное.

Если вы хотите оставить оригинального владельца и права доступа используйте опцию —preserve со значением mode,ownership или же опцию -p:

cp -p source/* destination

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

cp -a source/* destination

8. Копирование и Copy-on-Write

Некоторые новые файловые системы, такие как Btrfs и ZFS поддерживают технологию Copy-on-Write. При её использовании, фактическое копирование данных из файла будет происходить только при его изменении. Эта функция работает в рамках одной файловой системы и сильно ускоряет копирование файлов. Но зато, их изменение может быть немного замедлено. По умолчанию cp использует Copy-on-Write только начиная с версии CoreUtils 9.0. но вы можете включить или отключить её вручную с помощью опции —reflink. Вот доступные значения:

  • always — всегда использовать, если не поддерживается будет выведена ошибка;
  • auto — использовать только если поддерживается;
  • never — никогда не использовать.

Например, для того чтобы включить обязательное использование CoW добавьте —reflink=always в команду копирования:

cp -reflink=always file3 destination

9. Обработка разреженных файлов

Разреженные файлы, это файлы которые содержат последовательности нулевых байт и в них эти последовательности заменены на их описание. Это актуально для образов дисков Qemu или VirtualBox, которые могут содержать много пустого места, которое не обязательно записывать на диск. По умолчанию, cp создает разреженные файлы только если файл источник разрежен. Однако можно настроить его таким образом, чтобы все файлы содержащие последовательности нулей делались разреженными. Настроить это поведение можно с помощью опции —sparse. Вот возможные значения:

  • auto — используется по умолчанию;
  • never — делать разреженные файлы не разрежеными;
  • always — делать файлы разреженными если они содержат достаточное количество нулевых байт.

В качестве примера можно создать образ на основе /dev/zero размером 20 мегабайт:

dd if=/dev/zero of=image1 count=20 bs=1M

Если скопировать этот файл с опцией —sparse=always, то он станет разреженным и будет занимать значительно меньше места на диске:

cp —sparse=always ./image1 /destination

Выводы

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

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

Источник: losst.pro

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru