cp -a foo/* bar/
Copiará el contenido de foo en la barra, reemplazando cualquier archivo que ya exista. Puedo usar el indicador -n para cp
no sobrescribir archivos existentes o -i
para que pregunte de forma interactiva si sobrescribir archivos.
Preguntas
- ¿Hay alguna manera de hacer
cp
que falle y devolver un código de error si el archivo ya existe? - Si no, ¿es posible hacerlo con
rsync
alguna otra herramienta común?
Respuesta1
linux
Es posible fallar si un archivo existe en Linux, mediante un ligero truco con GNU nohup
. nohup
redirecciona /dev/null
a stdin
para que se ignoren las indicaciones interactivas, pero trata el uso de stdin
como un error.
$ nohup cp -ia foo/* bar/
Para limpiar un poco:
$ nohup cp -ia foo/* bar/ 2>nohup.out && rm nohup.out || cat nohup.out
- Por defecto
nohup
redireccionastdout
hacianohup.out
ystderr
haciastdout
. 2>nohup.out
ponestderr
en el archivo también.- Se
&& rm || cat
limpiará en caso de éxito o generará el error en casonohup.out
de error. Puede agregar cualquier manejo de errores que desee en lugar de/incluidocat
o eliminar todo eso y tratarlo$?
normalmente. - Tendrá que ser un poco más inteligente con respecto a la ubicación del archivo temporal si usa esto en serio (
mktemp -d
)
BSD
En BSD, puede redirigir stdin
a cp
lo que será tratado como n
y devolverá un estado distinto de 0.
$ cp -ia foo/* bar/ </dev/null
OSX
Sorprendentemente, en OSX cp
se comporta de manera diferente a BSD y devuelve un estado distinto de 0 -n
en un archivo omitido.
$ cp -n foo/* bar/