Скопировать содержимое папки другую папку linux

How can I copy the contents of a folder to another folder in a different directory using terminal?

I am trying to copy the contents of a folder to another folder in a different directory using terminal. Would somebody be able to provide me an example of the command line syntax required to achieve this?

8 Answers 8

You can copy the content of a folder /source to another existing folder /dest with the command

The -a option is an improved recursive option, that preserve all file attributes, and also preserve symlinks.

The . at end of the source path is a specific cp syntax that allow to copy all files and folders, included hidden ones.

@DylanValade: -a already implies —preserve=all , that is wider than -p = —preserve=mode,ownership,timestamps .

@BennyNeugebauer: scp is used to copy over a network (through ssh ) and only encrypts the communication channel, not the files on the destination filesystem.

«The . at end of the source path is a specific cp syntax that allow to copy all files and folders, included hidden ones.», this is not related to cp, but related to bash. The dot means «this location» and avoids the use of bash globbing, where by default files/directories starting with a . are not expanded.

Can someone explain the need behind use of mypath/. instead of the existing bash wildcard expansion character, mypath/* ?

rsync -a source/ destination 

The advantages of rsync are:

  1. After the initial sync, it will then copy only the files that have changed.
  2. You can use it over a network, convenient for files in $HOME, especially config files.

This will not copy hidden files, since bash expands * only to non-hidden file. The solution by @Joschua is safer.

If it’s a big folder you may wish to use one of these options to view progress while it’s copying askubuntu.com/questions/609303/…

Lets say you have a folder called folder1 in your ~ , inside folder1 is 1 file called file1 and 2 folders called sub1 and sub2 each with other files and folders inside them.

To copy all the contents of ~/folder1 to ~/new_folder1 you would use

new_folder1 would then contain all the files and folders from folder1 .

cp is the command to copy using a terminal, -r makes it recursively (so, current directory + further directories inside current) ~/folder1 is the origin folder, ~/new_folder1 is the destination folder for the files/folders inside the origin.

Thank you Bruno! It helped me to understand the syntax, though I had to change it a bit(removing ~ sign). Maybe because the destination folder was in /opt, which resides in another file system. And thank you Portablejim to remember the hidden file thing!

Читайте также:  Astra linux мерцает экран

The trailing period is important. Without it, sometimes it may create a new subdirectory ~/new_folder1/folder1 instead of copying the contents over.

@Alex78191 [root@ home]# mkdir food [root@ home]# cd food/ [root@ food]# mkdir .fruit [root@ food]# mkdir veggies [root@ food]# touch veggies/carrots [root@ food]# touch .fruit/apple [root@ food]# ls * carrots [root@ food]#

Simple example.

Copy the directory dir_1 and its contents (files) into directory dir_2:

cp -r ./dir_1 ./dir_2 # or cp -r ./dir_1/ ./dir_2/ # Results in: ./dir_2/dir_1/_files_ 

Copy only the contents (files) of dir_1 into directory dir_2:

cp -r ./dir_1/. ./dir_2 # or cp -r ./dir_1/. ./dir_2/ # Results in: ./dir_2/_files_ 

_files_ is a placeholder for the actual files located in the directory.

Check this http://www.cyberciti.biz/faq/copy-folder-linux-command-line/ for more information on copying folder. Hope this helps.

cp is a Linux command for copying files and directories. The syntax is as follows:

cp source destination cp dir1 dir2 cp -option source destination cp -option1 -option2 source destination 

In this example copy /home/vivek/letters folder and all its files to /usb/backup directory:

cp -avr /home/vivek/letters /usb/backup 

-a : Preserve the specified attributes such as directory an file mode, ownership, timestamps, if possible additional attributes: context, links, xattr, all.

-v : Explain what is being done.

-r : Copy directories recursively. Example

Copy a folder called /tmp/conf to /tmp/backup:

This code with Flag «-R» copies perfectly all the contents of «folder1» to existing «folder2»:

Flag «-R» copies symbolic links as well but Flag «-r» skips symbolic links so Flag «-R» is better than Flag «-r».

-R, --dereference-recursive For each directory operand, read and process all files in that directory, recursively, following all symbolic links. 
-r, --recursive For each directory operand, read and process all files in that directory, recursively. Follow symbolic links on the command line, but skip symlinks that are encountered recursively. Note that if no file operand is given, grep searches the working directory. This is the same as the ‘--directories=recurse’ option. 

Источник

Копирование файлов и директорий: команда 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

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

Читайте также:  Python создать виртуальное окружение linux

Для пользователей 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 , чтобы хотя бы знать, какие есть варианты.

Источник

Как скопировать содержимое каталога в другой каталог?

Команду то я нашёл. Но мне не понятно откуда взялся синтаксис /. ? Это что то вроде регулярного выражения? В мануале информации нет. Спасибо.

1 ответ 1

Каждый каталог содержит в себе два обязательных элемента:

  • псевдокаталог .. , обозначающий каталог выше по дереву директорий (даже в / есть /.. , но обозначает всё так же / )
  • псевдокаталог . , обозначающий самого себя. Например, используется в командах для обозначения пути от текущего каталога: ./configure вызывающий скрипт configure в текущей директории.

Таким образом, в команде cp -r dir1/. dir2 аргумент dir/. является просто необычной записью cp -r dir1 dir2 . Можно писать и как-то экзотично:

Однако поведение cp неожиданно отличается в случае если dir2 уже существует, а не будет создан командой cp .

cp -r dir1 dir2 # и аналогично cp -r dir1/ dir2 

Для существующего dir2 создаст копию директории dir1 в dir2/dir1 вместо копирования содержимого dir1 в dir2 .

Именно будет копировать содержимое dir1 в dir2 .

Это неочевидная особенность реализации именно cp . Например, rsync такими странными вещами не занимается и следующие записи эквивалентны:

rsync -a dir1 dir2/ rsync -a dir1/. dir2/ 

(но rsync при этом будет различаться поведением для записи dir2/ и dir2 для существующей директории, лучше указывать как подсказывает автокомплит, оканчивая путь / )

Источник

Оцените статью
Adblock
detector