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

правильное копирование папок с файлами в *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 со всеми его свойствами (название, содержимое, размер) в другом месте жесткого диска или съемного носителя. Например, для создания копии на «флешке» ваших фотографий, музыки, документов и т.п. При копировании, ваши исходные данные на жестком диске или другом носителе остаются на месте.

Рассмотрим копирование папки пошагово, на примере работы в обозревателе  дисков «Компьютер».

  1. Откройте папку «Компьютер» щелкнув по соответствующему пункту в «Главном меню».
  2. Выберите локальный диск, в котором находятся файлы или папки для копирования.
  3. Выберите необходимый файл или папку для копирования.
  4. Кликом правой кнопки мыши на выбранном объекте вызовите контекстное меню, в котором кликните левой кнопкой мыши на пункт «Копировать».
  5. Меню пропадет, а выбранный объект будет скопирован во временное хранилище в памяти компьютера, называемое «Буфер обмена». Визуально данное действие никак не будет отражено.
  6. Для завершения копирования папки (или файла) теперь его нужно вставить.

к оглавлению ↑

Как вставить папку или файл

В результате предыдущей операции, наша папка (или файл) находится в буфере обмена, ожидая вставки. Вставка – это копирование объекта из буфера обмена в какое-либо место жесткого диска или съемного носителя. Для выполнения выполните следующие действия:

  1. Двойным кликом левой кнопки мыши выберите в обозревателе дисков «Компьютер» место, куда нужно вставить объект из буфера обмена. Это может быть корневой каталог диска или папка в нем.
  2. Кликом правой кнопки мыши в пустом месте окна вызовите контекстное меню, где кликните левой кнопкой «Вставить», в результате чего в выбранном месте появится необходимая папка или файл, а исходный объект остается на месте.

к оглавлению ↑

Перемещение папки или файла с помощью операции «Вырезание»

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

  1. Выберите в обозревателе дисков «Компьютер» необходимый объект.
  2. Щелчком правой кнопки мыши на выбранном объекте вызовите контекстное меню, в котором кликните на пункте «Вырезать».
  3. Контекстное меню пропадет, папка (или файл) будет скопирована в буфер обмена. Иконка объекта поблекнет.
  4. Вставить папку или файл в нужное место, выполнив выше рассмотренную операцию «Вставить». Исходный объект в прежнем месте будет удален.

к оглавлению ↑

Групповая операция копирования, вставки, перемещения папок и файлов

До сих пор мы оперировали с одним файлом или папкой. А что делать, если нам нужно скопировать или переместить несколько? Копировать по одному файлу, особенно если их много – нерационально. Для этого существует такой прием, как выделение. Чтобы выделить нужные объекты, зажмите левую кнопку мышки и, не отпуская ее, обведите курсором нужные объекты. Выделенные файлы и папки будет в прямоугольной зоне, окрашенной в синий цвет.

После чего вызовите контекстное меню щелчком правой кнопки и выберите в нем необходимое действие (копировать, вставить, вырезать).

Поделиться.

к оглавлению ↑

Оболочка

— Как скопировать папку с удаленного компьютера на локальный с помощью scp?

спросил

Изменено
3 месяца назад

Просмотрено
2,9 млн раз

Как скопировать папку с удаленного узла на локальный с помощью scp ?

Я использую ssh для входа на свой сервер.
Затем я хотел бы скопировать удаленную папку foo в локальную папку /home/user/Desktop .

Как мне этого добиться?

  • оболочка
  • ssh
  • командная строка
  • копия
  • scp

5

 scp -r user@your. server.example.com:/path/to/foo /home/user/Desktop/
 

Не включая завершающий ‘/’ в конце foo, вы скопируете сам каталог (включая содержимое), а не только содержимое каталога.

Из man scp (см. онлайн-руководство)

-r Рекурсивно копировать каталоги целиком

16

Чтобы использовать всю мощь scp , вам необходимо выполнить следующие шаги:

  1. Авторизация открытого ключа
  2. Создание псевдонимов 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 username@hostname:/path/to/remote
 

Чтобы скопировать все из удаленного местоположения в локальное местоположение (загрузка)

 scp -r имя_пользователя@имя_хоста:/путь/из/удаленного /путь/к/локальному
 

Пользовательский порт, где xxxx пользовательский порт номер

 scp -r -P xxxx username@hostname:/path/from/remote /path/to/local
 

Копировать текущий каталог с Удаленный на локальный

 scp -r имя_пользователя@имя_хоста:/путь/из/удаленного . 
 

Справка:

  1. -r Рекурсивно скопировать все каталоги и файлы
  2. Всегда использовать полное местоположение из /, получить полное местоположение/путь с помощью pwd
  3. scp заменит все существующие файлы
  4. имя хоста будет именем хоста или IP-адресом
  5. , если требуется пользовательский порт (помимо порта 22), используйте -P PortNumber
  6. . (точка) — означает текущий рабочий каталог, так что скачивайте/скопируйте с сервера и вставьте только сюда.

Примечание: Иногда настраиваемый порт не работает из-за того, что порт не разрешен в брандмауэре, поэтому убедитесь, что настраиваемый порт разрешен в брандмауэре для входящих и исходящих соединений

9

Я всегда использую:

 scp -r username@IP:/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 user@remote. tld :/путь/к/папке /ваш/локальный/целевой/каталог
 

Вопрос заключался в том, как скопировать папку с удаленного компьютера на локальный с помощью команды scp .

$ scp -r userRemote@remoteIp:/path/remoteDir /path/localDir

Но вот лучший способ сделать это с sftp — Протокол передачи файлов SSH (также безопасный протокол передачи файлов или SFTP) — это сетевой протокол, который обеспечивает доступ к файлам, передачу файлов и управление файлами через любой надежный поток данных (википедия).

$ sftp user_remote@remote_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 user@remote:/remote-dir/remote-file /local-dir/local-file

Копировать папку на Google Диске

  • Советы

    • Водить машину
    • Gmail
    • Документы
    • Овердрайв
    • Календарь
    • Листы
    • Места
    • Хром
    • Контакты
    • Слайды
    • Чат
    • Встретиться
    • Формы
    • Держать
    • Более.