Por padrão, cptesta se seu último argumento é um diretório existente. Se isso acontecer, cpcria um link dentro desse diretório, com o nome base da fonte. Ou seja, dado o comando
cp foo/bar wibble
if wibbleé um diretório existente, cpcopia a fonte para wibble/bar. Se wibblenão existir, cpvincule a fonte a wibble.
Se você quiser ter certeza de que a cópia é sempre wibble, poderá especificar a opção --no-target-directory(alias -T). Dessa forma, se cpfor bem-sucedido, você pode ter certeza de que a cópia é chamada wibble. Se wibblejá existir como um diretório, cpfalhará.
Em forma de tabela:
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
A única diferença é que -T, caso o destino seja um diretório existente, o comando retornará um erro. Isso é útil quando você espera que o diretório não exista: você recebe uma mensagem de erro em vez de algo imprevisível.
O mesmo se aplica a mve ln. Se o destino for um diretório existente, com -T, eles sinalizam um erro, em vez de fazerem algo diferente silenciosamente.
Com cp, há um caso diferente. Se você fizer uma cópia recursiva e a fonte for um diretório, cp -Tcopie o conteúdo da fonte no destino, em vez de copiar a própria fonte. Ou seja, dado
$ tree source destination
source
└── foo
destination
└── bar
então
$ cp -rv source destination
`source' -> `destination/source'
`source/foo' -> `destination/source/foo'
enquanto que
% cp -rvT source destination
`source/foo' -> `destination/foo'
--no-target-directoryopção [out] : desde que eu use --recursive, está tudo bem [coreutils 8.12no GNU / Linux]. A principal diferença parece ser que com--no-target-directoryo conteúdo, mas não o próprio diretório é copiado [pesquisa ainda em andamento]