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'