Por padrão, cp
testa se seu último argumento é um diretório existente. Se isso acontecer, cp
criará um link dentro desse diretório, com o nome base da origem. Isto é, dado o comando
cp foo/bar wibble
se wibble
for um diretório existente, então cp
copia a origem para wibble/bar
. Se wibble
não existir, então cp
ligará a fonte a wibble
.
Se você quiser ter certeza de que a cópia é sempre wibble
, você pode especificar a opção --no-target-directory
(alias -T
). Dessa forma, se cp
for bem-sucedida, você pode ter certeza de que a cópia é chamada wibble
. Se wibble
já existia como um diretório, então 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, com -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 acontecendo.
O mesmo se aplica a mv
e ln
. Se o destino for um diretório existente, com -T
, eles sinalizarão um erro em vez de fazer algo diferente em silêncio.
Com cp
, há um caso diferente. Se você fizer uma cópia recursiva e a origem for um diretório, então cp -T
copia o conteúdo da origem no destino, em vez de copiar a própria fonte. Isto é, dado
$ tree source destination
source
└── foo
destination
└── bar
então
$ cp -rv source destination
'source' -> 'destination/source'
'source/foo' -> 'destination/source/foo'
enquanto
% cp -rvT source destination
'source/foo' -> 'destination/foo'