cp
всегда копирует файл (ы) в начале команды в файл или каталог в конце команды. Косая черта не имеет большого значения для аргументов, если аргумент не является символической ссылкой на каталог. Тогда косая черта будет рассматривать его как каталог, в то время как косая черта копирует саму ссылку.
Предполагая, что вы хотите рекурсивно копировать любые подкаталоги в своих примерах, вы сделаете их так:
cp -r /home/src/somedir /dest
а также
cp -r /home/src/somedir/* /dest
Первый получает каталог /home/src/somedir
и копирует этот аргумент, сам каталог и все его содержимое в последний аргумент /dest
. При необходимости он создаст каталог somedir
в /dest
и будет использовать его, если он уже существует.
Второй добавляет *
к концу первого аргумента, который будет расширяться оболочкой для каждого файла, с которого не начинается .
в /home/src/somedir
и скопирует все эти файлы и каталоги в /dest
независимо от того, что там уже есть (за исключением того, что некоторые флаги для cp
заставят перезаписать файлы, которые будут иметь то же значение в месте назначения, что и существующий файл).
Как отмечалось в комментариях к этому ответу, существуют проблемы с использованием *
для захвата всех файлов в каталоге. Один из вариантов - использовать tar
для копирования.
tar -c -C /home/src/somedir . | tar -x -C /dest
это создаст tar-файл somedir
без начального пути, используя -C
чтобы сначала переключиться на этот каталог. По умолчанию tar
будет печатать в стандартный stdout
который мы затем передадим по конвейеру другому tar
чтобы извлечь его, переключаясь в нужный каталог /dest
. Это также сохранит множество атрибутов файла, что может сделать и cp
.