- Как копировать файлы и каталоги в Linux
- Копирование файлов с помощью команды cp
- Скопируйте файл в каталог
- Копировать несколько файлов
- Копирование каталогов с помощью команды cp
- Копирование файлов и каталогов с помощью команды rsync
- Выводы
- Как быстро скопировать 400 Гб мелких файлов в куче каталогов или смонтировать два одинаковых LVM
- Быстро перенести(скопировать) мегадиректорию
Как копировать файлы и каталоги в Linux
Копирование файлов и каталогов — одна из наиболее распространенных задач, которые вы будете выполнять при работе в командной строке. В Linux есть несколько команд для копирования файлов, наиболее широко используемые инструменты — cp и rsync .
Обычной практикой является использование команды cp для копирования файлов и rsync для копирования каталогов.
Чтобы иметь возможность копировать файлы и каталоги, у вас должны быть как минимум права на чтение исходного файла и права записи в целевой каталог.
Копирование файлов с помощью команды cp
В операционных системах Linux и Unix команда cp используется для копирования файлов и каталогов.
Самый простой вариант использования — скопировать файл в текущий рабочий каталог. Например, чтобы скопировать файл с именем file.txt в файл с именем file_backup.txt в текущем каталоге , вы должны выполнить следующую команду:
cp file.txt file_backup.txt
Если целевой файл существует, он будет перезаписан. Чтобы получить запрос на подтверждение перед перезаписью файлов, используйте параметр -i .
cp -i file.txt file_backup.txt
По умолчанию при использовании команды cp для копирования файла новый файл будет принадлежать пользователю, выполняющему команду. Используйте параметр -p чтобы сохранить режим файла, владельца и временные метки :
cp -p file.txt file_backup.txt
Другой вариант, который может быть полезен, — это -v . При использовании этой опции команда печатает, что делается:
cp -v file.txt file_backup.txt
Скопируйте файл в каталог
Чтобы скопировать файл в каталог, укажите абсолютный или относительный путь к каталогу. Если целевой каталог не указан, файл копируется в текущий каталог.
В следующем примере мы file.txt файл file.txt в file.txt /backup :
При указании в качестве места назначения только имени каталога скопированный файл будет иметь то же имя, что и исходный файл.
Если вы хотите скопировать файл под другим именем, вам необходимо указать желаемое имя файла:
cp file.txt /backup/new_file.txt
Приведенная выше команда скопирует файл в указанный каталог как new_file.txt .
Копировать несколько файлов
Чтобы скопировать сразу несколько файлов и каталогов, укажите имена исходных файлов и каталогов, за которыми следует каталог назначения в качестве последнего аргумента:
cp file.txt dir file1.txt file2.txt dir1
При копировании нескольких файлов местом назначения должен быть каталог.
Команда cp также позволяет использовать сопоставление с образцом. Например, чтобы скопировать все файлы .png из текущего каталога в каталог /backup , вы должны использовать:
Копирование каталогов с помощью команды cp
Чтобы скопировать каталог, включая все его файлы и подкаталоги, используйте параметр -R или -r . В следующем примере мы копируем каталог Pictures в Pictures_backup :
cp -R Pictures Pictures_backup
Приведенная выше команда создаст каталог назначения и рекурсивно скопирует все файлы и подкаталоги из источника в каталог назначения.
Если целевой каталог уже существует, сам исходный каталог и его содержимое копируются в целевой каталог. Чтобы скопировать только файлы и подкаталоги, но не целевой каталог, используйте параметр -T :
cp -RT Pictures Pictures_backup
Параметры, используемые при копировании файлов, также могут использоваться при копировании каталогов. Основное отличие состоит в том, что при копировании каталогов необходимо использовать параметр -R .
Копирование файлов и каталогов с помощью команды rsync
rsync — это быстрая и универсальная утилита командной строки, которая синхронизирует файлы и каталоги между двумя местоположениями. Его можно использовать для копирования файлов в локальные и удаленные места.
rsync включает множество параметров, которые контролируют каждый аспект его поведения.
Наиболее полезная опция -a которая рекурсивно копирует каталоги, передает специальные и блочные устройства и сохраняет символические ссылки, время модификации, группу, владение и разрешения.
Чтобы скопировать один файл из одного места в другое, вы должны выполнить следующую команду:
rsync -a file.txt file_backup.txt
Если целевой файл существует, rsync перезапишет его.
Эту же команду можно использовать для копирования каталога:
rsync -a /var/www/public_html/ /var/www/public_html_backup/
rsync по-разному rsync исходным каталогам, заканчивающимся косой чертой / . Если вы добавите завершающую косую черту в исходный каталог, команда скопирует только содержимое исходного каталога в целевой каталог. Если косая черта в конце опущена, rsync скопирует исходный каталог в целевой каталог. Самый безопасный вариант — всегда включать косую черту / как в месте назначения, так и в источнике.
Чтобы узнать больше о rsync прочтите следующие статьи:
Выводы
Мы показали вам, как копировать файлы и каталоги в системах на базе Linux и Unix, используя утилиты cp и rsync .
Если у вас есть вопросы, оставьте комментарий ниже.
Как быстро скопировать 400 Гб мелких файлов в куче каталогов или смонтировать два одинаковых LVM
Сейчас запустил rsync —progress -av /input/folder /outputfolder Только что добавил ещё —exclude-from ‘файл со списков *директорый*’ Скорость копирвоания мелких файлов 10-200 кб/с, Что очень мало.
Думал скопировать побайтово командой dd, но не уверен что получится, так как: df -h /dev/mapper/group-data 660G 347G 280G 56% /home (откуда) /dev/vdb5 379G 131G 230G 37% /mnt (куда) Смущает факт, что при побайтовом, файлы могут быть разбросаны по всей длине /dev/mapper/group-data 660G, и в итоге не поместятся на /dev/vdb5 379G.
Подскажите как максимально быстро их скопировать?
Итоговая цель задачи: После обновления Zentyal, перестала нормально работать самба, невозможность записи(недостаточно места), открытия(недостаточно прав), и невозможность настроить(вылетает). Восстановил из бэкапа машину, но нужно скопировать свежеизмененные файлы.
Разделы на машине в LVM. И подключив к одной машине оба диска, второй выдает ошибку, уже не помню какую. Поэтому решил копировать рсинком.
Если кто то подскажет как мне смонтировать в востановленной машине /dev/mapper/group-data со старой машины, вместо восстановленного, буду благодарен. Итак имеем, vda (new), vdb (old). Старый диск просто скопирован и подключен к виртуалке. Метки и идентификаторы, значит диски имеют одинаковые.. Ибо это один и тот же диск. Как мне примонтировать диск со старой машины в востановленную?
Быстро перенести(скопировать) мегадиректорию
Есть папка. В ней 160 гиг мелкого 1-2 килобайтного файла + немереянно вложенных папок.
Нада скопировать на другой сервер. Быстро.
Подмонтировал на сервер с файлом папку с пустого сервера через нфс.
В восемь вечера пустил в скрине копировать. В семь утра зашел — копирует до сих пор.
Есть варианты как можно быстро скопировать?
Через ssh: там, откуда копировать, запускаем gzip и передачу файлов через трубу, там, куда копировать, раззиповываем.
А вообще, странно, что так медленно.
По сети? 160 гигов? Ну сутки будет копировать, мб больше. Хочешь быстро — езжай к удаленному компу, выдергивай винт и тащи его к себе.
что значит через gzip? на файловом серваке запаковать и перелить на пустой файл?
200 гиг мускульных дампов по гигу — перелились по сети за шесть часов.
хотят тут наверно долго изза мелкого размера файла
160 гиг мелкого 1-2 килобайтного файла
На файл-сервере запаковываете, но выхлоп gzip’а идет не в файл, а по ssh туда, куда надо это скопировать. Там, соответственно, на выходе трубы распаковывается. Недостаток: если сеть накроется, придется все копировать снова.
пример можете показать? а что если чесно не понимаю как это сделать.
Ты упоротый? Я тебе уже говорил копируй на уровне блочного устройства (drbd) или lvm-snapshot + ssh + dd или (лоровские задроты считают что LVM-ненужен) делай dd + ssh + fsck
поднимать drbd ради одного копирований?
tar -czf - /some/file | ssh host.name tar -xzf - -C /destination
Не шлангуй. drbd был предложен в теме «каждые 15 минут синхронизировать >250 миллионов файлов»
1. lvm-snapshot —> dd | ssh dd
2. нет LVM —> dd | ssh dd; fsck
Ему не нужно копировать раздел целиком. Да и от этого есть смысл, лишь в случае, когда раздел почти полностью забит. А во всех остальных случаях лучше всего — tar over ssh.
Насколько мне известно, nfs работает через udp, то есть у тебя нет гарантии что все файлы доехали корректно. На сеть другой нагрузки в это время не было?
Насколько мне известно, nfs работает через udp, то есть у тебя нет гарантии что все файлы доехали корректно.
Гарантия есть: либо файлы доехали корректно, либо не доехали.
Если при передаче одного файла в середине было потеряно несколько пакетов, то как об этом узнает команда cp?
Ему не нужно копировать раздел целиком.
В случае с мелкими файлами копирование раздела целиком может оказаться быстрее копирования всех файлов по отдельности. Чтобы не копировать незанятые места раздела, можно вместо dd использовать partclone или partimage. Но проделывать такие фокусы нужно с отмонтированным разделом, иначе ФС может перенестись битой.
Если при передаче одного файла в середине было потеряно несколько пакетов, то как об этом узнает команда cp?
Команда cp об этом узнает от соответствующего системного вызова, системный вызов от VFS, VFS от драйвера NFS, а драйвер NFS узнает о потере из пропущенных номеров пакетов или неправильной контрольной суммы (я не знаю точно какой именно там способ, но он однозначно есть).
И вообще, TCP тоже работает поверх «ненадёжного» протокола IP, но целостность потока там тем не менее гарантируется =).
Неверное планирование не освобождает от титула «дебил». Проекты с таким кол-вом файлов не распологают в директории на /, впрочем ЛОРовская школота с криками «LVM не нужен» и «достаточно / и /home» может теперь жевать свои мозоли.
А ты сначала подумай сколько времени займет просто прочитать с диска ~150.000.000 метаданных файлов, а потом и сами файлы — время копирования по сети можно будет не учитывать.
Уже пару-тройку лет по умолчанию nfs в линуксе через tcp.
А так, udp пакет имеет аналогичную tcp контрольную сумму, а повторную передачу пакетов организовывал уже сам nfs. Не помню, чтобы у меня были проблемы с передачей файлов по nfs по udp по 10 Мбит коксиальному кабелю.