Как скопировать папку: Копирование и перемещение файлов и папок
Содержание
правильное копирование папок с файлами в *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
Oz_Alex
cp -aT /source /target
ВНИМАНИЕ: регистр буквы T
имеет значение. Если перепутать, то получите полную белиберду: направление копирования поменяется.
Благодарности:
- Компании RUVDS.COM за поддержку и возможность публикации в своем блоге на Хабре.
- За изображение TripletConcept. Картинка очень большая и детальная, можно открыть в отдельном окне.
P.S. Замеченные ошибки направляйте в личку. Повышаю за это карму.
Как копировать, перемещать папки и файлы
В предыдущем материале мы изучили, как создавать, переименовывать и удалять папки с файлами. Теперь давайте рассмотрим такие операции, как копирование, вставка, перемещение файлов и папок, которыми вы будете часто пользоваться.
В Windows для работы с файлами, папками и дисками можно использовать или папку «Компьютер», или программу — файловый менеджер «Проводник», которые установлены при инсталляции операционной системы Windows. Папка «Компьютер» открывается через «Главное меню», для запуска программы «Проводник» щелкните правой кнопкой на кнопке «Пуск» и выберите пункт меню «Открыть проводник».
- Как копировать папку или файл
- Как вставить папку или файл
- Перемещение папки или файла с помощью операции «Вырезание»
- Групповая операция копирования, вставки, перемещения папок и файлов
- Еще по теме:
к оглавлению ↑
Как копировать папку или файл
Копирование применяется для создания полной копии объекта Windows со всеми его свойствами (название, содержимое, размер) в другом месте жесткого диска или съемного носителя. Например, для создания копии на «флешке» ваших фотографий, музыки, документов и т.п. При копировании, ваши исходные данные на жестком диске или другом носителе остаются на месте.
Рассмотрим копирование папки пошагово, на примере работы в обозревателе дисков «Компьютер».
- Откройте папку «Компьютер» щелкнув по соответствующему пункту в «Главном меню».
- Выберите локальный диск, в котором находятся файлы или папки для копирования.
- Выберите необходимый файл или папку для копирования.
- Кликом правой кнопки мыши на выбранном объекте вызовите контекстное меню, в котором кликните левой кнопкой мыши на пункт «Копировать».
- Меню пропадет, а выбранный объект будет скопирован во временное хранилище в памяти компьютера, называемое «Буфер обмена». Визуально данное действие никак не будет отражено.
- Для завершения копирования папки (или файла) теперь его нужно вставить.
к оглавлению ↑
Как вставить папку или файл
В результате предыдущей операции, наша папка (или файл) находится в буфере обмена, ожидая вставки. Вставка – это копирование объекта из буфера обмена в какое-либо место жесткого диска или съемного носителя. Для выполнения выполните следующие действия:
- Двойным кликом левой кнопки мыши выберите в обозревателе дисков «Компьютер» место, куда нужно вставить объект из буфера обмена. Это может быть корневой каталог диска или папка в нем.
- Кликом правой кнопки мыши в пустом месте окна вызовите контекстное меню, где кликните левой кнопкой «Вставить», в результате чего в выбранном месте появится необходимая папка или файл, а исходный объект остается на месте.
к оглавлению ↑
Перемещение папки или файла с помощью операции «Вырезание»
Операция «Вырезать» предназначена для перемещения папки или файла в другое место на жестком диске или съемном носителе, без сохранения исходного объекта. Для перемещения папки или файла следующие действия:
- Выберите в обозревателе дисков «Компьютер» необходимый объект.
- Щелчком правой кнопки мыши на выбранном объекте вызовите контекстное меню, в котором кликните на пункте «Вырезать».
- Контекстное меню пропадет, папка (или файл) будет скопирована в буфер обмена. Иконка объекта поблекнет.
- Вставить папку или файл в нужное место, выполнив выше рассмотренную операцию «Вставить». Исходный объект в прежнем месте будет удален.
к оглавлению ↑
Групповая операция копирования, вставки, перемещения папок и файлов
До сих пор мы оперировали с одним файлом или папкой. А что делать, если нам нужно скопировать или переместить несколько? Копировать по одному файлу, особенно если их много – нерационально. Для этого существует такой прием, как выделение. Чтобы выделить нужные объекты, зажмите левую кнопку мышки и, не отпуская ее, обведите курсором нужные объекты. Выделенные файлы и папки будет в прямоугольной зоне, окрашенной в синий цвет.
После чего вызовите контекстное меню щелчком правой кнопки и выберите в нем необходимое действие (копировать, вставить, вырезать).
Поделиться.
к оглавлению ↑
Оболочка
— Как скопировать папку с удаленного компьютера на локальный с помощью scp?
спросил
Изменено
3 месяца назад
Просмотрено
2,9 млн раз
Как скопировать папку с удаленного узла на локальный с помощью scp
?
Я использую ssh
для входа на свой сервер.
Затем я хотел бы скопировать удаленную папку foo
в локальную папку /home/user/Desktop
.
Как мне этого добиться?
- оболочка
- ssh
- командная строка
- копия
- scp
5
scp -r [email protected]server.example.com:/path/to/foo /home/user/Desktop/
Не включая завершающий ‘/’ в конце foo, вы скопируете сам каталог (включая содержимое), а не только содержимое каталога.
Из man scp
(см. онлайн-руководство)
-r Рекурсивно копировать каталоги целиком
16
Чтобы использовать всю мощь scp , вам необходимо выполнить следующие шаги:
- Авторизация открытого ключа
- Создание псевдонимов SSH
Затем, например, если у вас есть этот ~/.ssh/config :
Тест хоста Пользователь testuser Имя хоста test-site.example Порт 22022 Хост-продукт Производитель пользователя Имя хоста production-site.example Порт 22022
вы избавите себя от необходимости вводить пароль и упростите синтаксис scp следующим образом:
scp -r prod:/path/foo /home/user/Desktop # скопировать на локальный scp -r prod:/path/foo test:/tmp # скопировать из удаленного продукта в удаленный тест
Кроме того, вы сможете использовать удаленное завершение пути:
scp test:/var/log/ # дважды нажмите tab Показать все 151 возможность? (д или н)
Для включения удаленного завершения bash вам необходимо иметь bash-shell на обоих <источник>
и <цель>
хостов, и корректно работающее bash-дополнение. Дополнительные сведения см. в связанных вопросах:
Как включить автозаполнение для удаленных путей при использовании scp?
Завершение вкладки имени файла SCP
9
Чтобы скопировать все из локального местоположения в удаленное местоположение (загрузка)
scp -r /path/from/local [email protected]:/path/to/remote
Чтобы скопировать все из удаленного местоположения в локальное местоположение (загрузка)
scp -r имя_пользователя@имя_хоста:/путь/из/удаленного /путь/к/локальному
Пользовательский порт, где xxxx
— пользовательский порт номер
scp -r -P xxxx [email protected]:/path/from/remote /path/to/local
Копировать текущий каталог с Удаленный на локальный
scp -r имя_пользователя@имя_хоста:/путь/из/удаленного .![]()
Справка:
-
-r
Рекурсивно скопировать все каталоги и файлы - Всегда использовать полное местоположение из
/
, получить полное местоположение/путь с помощьюpwd
-
scp
заменит все существующие файлы -
имя хоста
будет именем хоста или IP-адресом - , если требуется пользовательский порт (помимо порта 22), используйте
-P PortNumber
- . (точка) — означает текущий рабочий каталог, так что скачивайте/скопируйте с сервера и вставьте только сюда.
Примечание: Иногда настраиваемый порт не работает из-за того, что порт не разрешен в брандмауэре, поэтому убедитесь, что настраиваемый порт разрешен в брандмауэре для входящих и исходящих соединений
9
Я всегда использую:
scp -r [email protected]:/path/to/server/source/folder/ .![]()
. (точка) : это означает текущую папку
. поэтому скопируйте с сервера и вставьте только сюда.
IP : может быть IP-адресом, например 125.55.41.311
, или хостом, например ns1.mysite.example
.
1
Лучше сначала сжать каталог на удаленном сервере:
tar czfP backup.tar.gz /path/to/catalog
Во-вторых, загрузите с удаленного сервера:
scp [email protected]:/path/to/backup.tar.gz .
В конце извлеките файлы:
tar -xzvf backup.tar.gz
3
Типичный сценарий,
scp -r -P порт имя_пользователя@ip:/путь-к-папке .
объяснено с образцом,
scp -r -P 27000 [email protected]:/tmp/hotel_dump .
где,
порт = 27000 username = "abc", имя пользователя удаленного сервера путь к папке = tmp/hotel_dump .= текущий локальный каталог
1
И если у вас есть чертовски много файлов для загрузки из удаленного места, и если вы не очень заботитесь о безопасности, попробуйте изменить шифрование scp по умолчанию (Triple-DES) на что-то вроде «blowfish».
Это значительно сократит время копирования файлов.
scp -c blowfish -r [email protected]:/path/to/foo /home/user/Desktop/
1
Перейдите в раздел «Файлы» на панели инструментов Unity
Нажмите Ctrl + l и напишите здесь[email protected]
192.168.1.103 — это хост, к которому вы хотите подключиться.
Вот пример
0
В случае, если вы столкнулись с «Слишком много ошибок аутентификации» , укажите точный SSH-ключ, который вы добавили на свой сервер ssh:
scp -r -i /path/to/local/key [email protected]tld :/путь/к/папке /ваш/локальный/целевой/каталог
Вопрос заключался в том, как скопировать папку с удаленного компьютера на локальный с помощью команды scp
.
$ scp -r [email protected]:/path/remoteDir /path/localDir
Но вот лучший способ сделать это с sftp
— Протокол передачи файлов SSH (также безопасный протокол передачи файлов или SFTP) — это сетевой протокол, который обеспечивает доступ к файлам, передачу файлов и управление файлами через любой надежный поток данных (википедия).
$ sftp [email protected]_ip
SFTP> CD/PATH/TO/DEMOTERDIR
SFTP> GET -R DEMOTER
Избрать/Путь/TO/Remotedir TO LocaldIR 100% 398. 0. 0,00002
. с 00:00
Для справки о sftp
просто введите help
или ?
.
Я не знаю почему, но мне пришлось использовать локальную папку перед директивой исходного сервера. чтобы заставить его работать
scp -r . [email protected]:/usr/share/nginx/www/example.org/
1
Для ОС Windows мы использовали эту команду.
pscp -r -P 22 имя_хоста@IP:/путь/к/загрузки ./
Посылка вопроса неверна. Идея состоит в том, как после входа в ssh переместить файлы с вошедшего в систему компьютера обратно на клиент, который вошел в систему. Однако scp не знает и не может использовать ssh-соединение. Он устанавливает свои собственные связи. Таким образом, простое решение — создать новое окно терминала на локальной рабочей станции и запустить scp, который передает файлы с удаленного сервера на локальный компьютер. Например, scp -i key [email protected]:/remote-dir/remote-file /local-dir/local-file
Копировать папку на Google Диске
-
Советы
- Водить машину
- Gmail
- Документы
- Овердрайв
- Календарь
- Листы
- Места
- Хром
- Контакты
- Слайды
- Чат
- Встретиться
- Формы
- Держать
-
Более.