Per impostazione predefinita, cp
verifica se il suo ultimo argomento è una directory esistente. In tal caso, cp
crea un collegamento all'interno di quella directory, con il nome di base della fonte. Cioè, dato il comando
cp foo/bar wibble
se wibble
è una directory esistente, cp
copia l'origine in wibble/bar
. Se wibble
non esiste, cp
collega la fonte a wibble
.
Se vuoi essere sicuro che la copia sia sempre wibble
, puoi specificare l' opzione --no-target-directory
(alias -T
). In questo modo, se ha cp
esito positivo, puoi essere certo che la copia viene chiamata wibble
. Se wibble
esiste già come directory, allora cp
fallirà.
In forma tabellare:
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
L'unica differenza è che con -T
, nel caso in cui la destinazione sia una directory esistente, il comando restituisce un errore. Ciò è utile quando ci si aspetta che la directory non esista: viene visualizzato un messaggio di errore invece che accada qualcosa di non previsto.
Lo stesso vale per mv
e ln
. Se la destinazione è una directory esistente, con -T
, segnalano un errore anziché fare in silenzio qualcosa di diverso.
Con cp
, c'è un caso diverso. Se si esegue una copia ricorsiva e l'origine è una directory, quindi cp -T
copia il contenuto dell'origine nella destinazione, anziché copiare l'origine stessa. Cioè, dato
$ tree source destination
source
└── foo
destination
└── bar
poi
$ cp -rv source destination
`source' -> `destination/source'
`source/foo' -> `destination/source/foo'
mentre
% cp -rvT source destination
`source/foo' -> `destination/foo'
--no-target-directory
opzione [out] : finché uso --recursive, tutto va bene [concoreutils 8.12
sotto GNU / Linux]. La differenza principale sembra essere quella con--no-target-directory
il contenuto ma non la directory stessa viene copiata [ricerca ancora in corso]