По умолчанию 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.12GNU / Linux]. Основное различие заключается в том, что--no-target-directoryкопируется содержимое, а не сам каталог [исследования продолжаются]