Первые два имели бы больше смысла при рекурсивном копировании, т.е. cp -r
. Разница возникает, если источником является именованный каталог, а место назначения существует. Из них:
cp -r src/ dest
cp -r src/. dest
первый скопирует src
в dest
, создав dest/src
и файлы внутри него(src/a
станет dest/src/a
), а второй скопирует содержимое src
, поэтому src/a
станет dest/a
.
В двух других оболочка расширяет шар,поэтому содержимое каталога (, кроме dotfiles ), копируется даже без -r
.
cp./* dest
cp./** dest
В первом случае оболочка расширяет ./*
список имен файлов в текущем каталоге (, за исключением тех, которые начинаются с точки ), и cp
копирует их. Во втором случае оболочки, поддерживающие его, расширят ./**
до рекурсивного списка имен файлов, и снова cp
скопируют файлы, указанные в нем.
Рекурсивный **
работает по крайней мере в Bash, если установлен shopt -s globstar
, в ksh с set -o globstar
.
Ни Bash, ни ksh не включают файлы или каталоги с именами, начинающимися с точки, в результат **
, независимо от того, на каком уровне дерева они появляются, поэтому использование этого способа не очень хорошо для создания полной копии файла. полная структура каталогов; cp -r. dest
также будет копировать точечные файлы.
Bash имеет shopt -s dotglob
, который показывает точечные файлы как с *
, так и с **
, я не уверен, что ksh имеет аналогичную функцию.