Por padrão, cp
testa se seu último argumento é um diretório existente. Se isso acontecer, cp
cria 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, cp
copia a fonte para wibble/bar
. Se wibble
não existir, cp
vincule 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 cp
for bem-sucedido, você pode ter certeza de que a cópia é chamada wibble
. Se wibble
já existir como um diretório, cp
falhará.
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 mv
e 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 -T
copie 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-directory
opção [out] : desde que eu use --recursive, está tudo bem [coreutils 8.12
no GNU / Linux]. A principal diferença parece ser que com--no-target-directory
o conteúdo, mas não o próprio diretório é copiado [pesquisa ainda em andamento]