Перейти к содержимому

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

  • автор:

Копирование и перемещение файлов и папок

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

For example, you might want to copy a presentation onto a memory stick so you can take it to work with you. Or, you could make a back-up copy of a document before you make changes to it (and then use the old copy if you don’t like your changes).

Эти инструкции применимы как к файлам, так и к папкам. Копирование и перемещение файлов и папок выполняется одинаково.

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

  1. Выберите файл, который хотите скопировать, нажав на него.
  2. Нажмите правой кнопкой и выберите Копировать или нажмите Ctrl + C .
  3. Перейдите в папку, в которую нужно поместить копию файла.
  4. Click the menu button and pick Paste to finish copying the file, or press Ctrl + V . There will now be a copy of the file in the original folder and the other folder.

Перемещение файлов командами вырезания и вставки

  1. Выберите файл, который хотите переместить, нажав на него.
  2. Нажмите правой кнопкой и выберите Вырезать или нажмите Ctrl + X .
  3. Перейдите в ту папку, в которую нужно переместить файл.
  4. Click the menu button in the toolbar and pick Paste to finish moving the file, or press Ctrl + V . The file will be taken out of its original folder and moved to the other folder.

Копирование или перемещение файлов перетаскиванием

  1. Откройте менеджер файлов и перейдите в папку, содержащую файл, который нужно скопировать.
  2. Нажмите Nautilus в верхней панели и выберите Создать окно (или нажмите Ctrl + N ), чтобы открыть новое окно. В новом окне перейдите в папку, в которую нужно переместить или скопировать файл.
  3. Нажмите на файл и перетащите его из одного окна в другое. Файл будет перемещён , если целевая папка находится на том же устройстве, и скопирован , если целевая папка находится на другом устройстве. For example, if you drag a file from a USB memory stick to your Home folder, it will be copied, because you’re dragging from one device to another. Для принудительного копирования файла удерживайте при его перетаскивании нажатой клавишу Ctrl , а для принудительного перемещения — клавишу Shift .

You cannot copy or move a file into a folder that is read-only . Some folders are read-only to prevent you from making changes to their contents. You can change things from being read-only by changing file permissions .

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


Next: Перемещение файлов и каталогов Up: Работа с файлами Previous: Просмотр каталогов Contents Index

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

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

$ cp my-copy neighbor-copy [Enter]

Эта команда создает новый файл с именем `neighbor-copy’, который является идентичным файлу `my-copy’ во всех отношениях, кроме имени файла, имени владельца, группы и времени модификации — новый файл имеет время модификации, указывающее момент его копирования. Файл `my-copy’ не изменяется.

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

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

$ cp -p my-copy neighbor-copy [Enter]

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

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

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

$ cp -R public_html private_html [Enter]

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

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

$ cp -a public_html private_html [Enter]

Alex Otwagin 2002-12-16

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

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

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

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

cp /source/* /target

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

cp -a /source/* /target

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

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

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

Почему же так произошло?

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

shopt -s dotglob

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

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

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

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

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

getconf ARG_MAX

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

2097152
xargs --show-limits

Получим что-то типа:

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

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

Давайте просто напишем

cp -a /source /target

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

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

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

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

cp -a /source /home

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

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

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

cp -a /source/. /target

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

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

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

Выводы

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

Послесловие

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

cp -a -T /source /target
cp -aT /source /target

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

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

  • Блог компании RUVDS.com
  • Настройка Linux
  • Системное администрирование
  • *nix
  • Серверное администрирование

Как скопировать файлы и папки из одной директории в другую и отображать процесс копирования в QProgressBar?

Имеется директория с директориями и файлами.Нужно скопировать директорию с файлами в другое место.Имеется такой код:

void MainWindow::copyPath(QString src, QString dst) < QDir dir(src); if (!dir.exists()) return; foreach (QString d, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) < QString dst_path = dst + QDir::separator() + d; dir.mkpath(dst_path); qDebug() foreach (QString f, dir.entryList(QDir::Files)) < QFile::copy(src + QDir::separator() + f, dst + QDir::separator() + f); >> 

Запускаю функцию через QtConcurrent:

QFuture future = QtConcurrent::run(this,&MainWindow::copyPath,QString("/folder1"),QString("/home/user/folder2")); 

Как показать,сколько осталось до конца выполнения копирования файлов в QProgressBar?

Отслеживать

9,718 9 9 золотых знаков 24 24 серебряных знака 35 35 бронзовых знаков

задан 20 мая 2021 в 13:27

199 8 8 бронзовых знаков

1 ответ 1

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

class MainWindow: public QMainWindow < . public: MainWindow(QWidget* parent = null): QMainWindow(parent) < connect(this, &MainWindow::progress, [&](const QString& src, const QString& dst, int current, int total) < // Прогресс qDebug() ); > // Отправляем сигнал в очередь событий из потока run // src - путь к исходному файлу // dst - к файлу назначения // current - текущий прогресс // total - всего файлов папке void emitProgress(const QString& src, const QString& dst, int current, int total) < emit progress(src, dst, current, total); >signals: void progress(const QString& src, const QString& dst, int current, int total); > 
QFuture future = QtConcurrent::run( this, &MainWindow::copyPath, QString("/folder1"), QString("/home/user/folder2"), this); // указатель на объект класса с методом emitProgress 
void MainWindow::copyPath(QString src, QString dst, MainWindow* window) < QDir dir(src); if (!dir.exists()) return; foreach (QString d, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) < QString dst_path = dst + QDir::separator() + d; dir.mkpath(dst_path); copyPath(src+ QDir::separator() + d, dst_path); >// Счетчик int current = 1; auto list = dir.entryList(QDir::Files); foreach (QString f, list) < QString s = src + QDir::separator() + f; QString d = dst + QDir::separator() + f; QFile::copy(s, d); window->emitProgress(s, d, current++, list.length()); > > 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *