Por defecto, cp
prueba si su último argumento es un directorio existente. Si esto sucede, cp
crea un enlace dentro de ese directorio, con el nombre base de la fuente. Es decir, dado el comando
cp foo/bar wibble
si wibble
es un directorio existente, cp
copia la fuente en wibble/bar
. Si wibble
no existe, cp
vincula la fuente a wibble
.
Si desea asegurarse de que la copia sea siempre wibble
, puede especificar la opción --no-target-directory
(alias -T
). De esa manera, si cp
tiene éxito, puede estar seguro de que se llama a la copia wibble
. Si wibble
ya existía como directorio, entonces cp
fallará.
En forma tabular:
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
La única diferencia es que -T
, en caso de que el destino sea un directorio existente, el comando devuelve un error. Esto es útil cuando espera que el directorio no exista: recibe un mensaje de error en lugar de que ocurra algo imprevisto.
Lo mismo se aplica a mv
y ln
. Si el objetivo es un directorio existente, con -T
, señalan un error en lugar de hacer algo diferente en silencio.
Con cp
, hay un caso diferente. Si realiza una copia recursiva y la fuente es un directorio, cp -T
copia el contenido de la fuente en el destino, en lugar de copiar la fuente misma. Es decir, dado
$ tree source destination
source
└── foo
destination
└── bar
entonces
$ cp -rv source destination
`source' -> `destination/source'
`source/foo' -> `destination/source/foo'
mientras
% cp -rvT source destination
`source/foo' -> `destination/foo'
--no-target-directory
opción [out] : siempre que use --recursive, todo está bien [concoreutils 8.12
GNU / Linux]. La principal diferencia parece ser que con--no-target-directory
el contenido, pero no con el directorio en sí mismo, se copia [investigación aún en curso]