Per impostazione predefinita, cpverifica se il suo ultimo argomento è una directory esistente. In tal caso, cpcrea 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, cpcopia l'origine in wibble/bar. Se wibblenon esiste, cpcollega 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 cpesito positivo, puoi essere certo che la copia viene chiamata wibble. Se wibbleesiste già come directory, allora cpfallirà.
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 mve 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 -Tcopia 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-directoryopzione [out] : finché uso --recursive, tutto va bene [concoreutils 8.12sotto GNU / Linux]. La differenza principale sembra essere quella con--no-target-directoryil contenuto ma non la directory stessa viene copiata [ricerca ancora in corso]