Copie el directorio, pero falle si el archivo ya existe en el destino

Copie el directorio, pero falle si el archivo ya existe en el destino

cp -a foo/* bar/Copiará el contenido de foo en la barra, reemplazando cualquier archivo que ya exista. Puedo usar el indicador -n para cpno sobrescribir archivos existentes o -ipara que pregunte de forma interactiva si sobrescribir archivos.

Preguntas

  • ¿Hay alguna manera de hacer cpque falle y devolver un código de error si el archivo ya existe?
  • Si no, ¿es posible hacerlo con rsyncalguna otra herramienta común?

Respuesta1

linux

Es posible fallar si un archivo existe en Linux, mediante un ligero truco con GNU nohup. nohupredirecciona /dev/nulla stdinpara que se ignoren las indicaciones interactivas, pero trata el uso de stdincomo 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 nohupredirecciona stdouthacia nohup.outy stderrhacia stdout.
  • 2>nohup.outpone stderren el archivo también.
  • Se && rm || catlimpiará en caso de éxito o generará el error en caso nohup.outde error. Puede agregar cualquier manejo de errores que desee en lugar de/incluido cato 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 stdina cplo que será tratado como ny devolverá un estado distinto de 0.

$ cp -ia foo/* bar/ </dev/null

OSX

Sorprendentemente, en OSX cpse comporta de manera diferente a BSD y devuelve un estado distinto de 0 -nen un archivo omitido.

$ cp -n foo/* bar/

información relacionada