По умолчанию cp
проверяет, является ли его последний аргумент существующим каталогом. Если это произойдет, cp
создаст ссылку внутри этого каталога с базовым именем источника. То есть с учетом команды
cp foo/bar wibble
Если wibble
это существующий каталог, то cp
копирует источник в wibble/bar
. Если wibble
не существует, то cp
ссылки на источник wibble
.
Если вы хотите быть уверены, что копия всегда wibble
, тогда вы можете указать опцию --no-target-directory
(псевдоним -T
). Таким образом, в случае cp
успеха вы можете быть уверены, что копия вызывается wibble
. Если wibble
каталог уже существует, cp
произойдет сбой.
В табличной форме:
The target is … Without -T With -T
existing directory copy in the directory error
existing file (not dir) overwrite overwrite
does not exist create create
Единственное отличие состоит в том -T
, что в случае, если целью является существующий каталог, команда возвращает ошибку. Это полезно, когда вы ожидаете, что каталог не существует: вы получите сообщение об ошибке вместо чего-то непредвиденного.
То же самое относится mv
и к ln
. Если целью является существующий каталог, -T
они сообщают об ошибке, а не молча делают что-то другое.
С cp
, есть другой случай. Если вы делаете рекурсивное копирование, а источник является каталогом, то cp -T
копирует содержимое источника в место назначения, а не копирует сам источник. То есть дано
$ tree source destination
source
└── foo
destination
└── bar
тогда
$ cp -rv source destination
`source' -> `destination/source'
`source/foo' -> `destination/source/foo'
в то время как
% cp -rvT source destination
`source/foo' -> `destination/foo'
--no-target-directory
опцией [out] : пока я использую --recursive, все в порядке [сcoreutils 8.12
GNU / Linux]. Основное различие заключается в том, что--no-target-directory
копируется содержимое, а не сам каталог [исследования продолжаются]