Copia o diretório, mas falha se o arquivo já existir no destino

Copia o diretório, mas falha se o arquivo já existir no destino

cp -a foo/* bar/irá copiar o conteúdo de foo para bar, substituindo todos os arquivos que já existem. Posso usar o sinalizador -n para cpnão sobrescrever os arquivos existentes ou -ipara perguntar interativamente se devo sobrescrever os arquivos.

Questões

  • Existe uma maneira de falhar cpe retornar um código de erro se o arquivo já existir?
  • Se não, é possível fazer isso com rsyncalguma outra ferramenta comum?

Responder1

Linux

É possível falhar se existir um arquivo no Linux, através de um leve hack com GNU nohup. nohupredireciona /dev/nullpara stdinque quaisquer prompts interativos sejam ignorados, mas trata o uso de stdincomo uma falha.

$ nohup cp -ia foo/* bar/

Para limpar um pouco:

$ nohup cp -ia foo/* bar/ 2>nohup.out && rm nohup.out || cat nohup.out
  • Por padrão, nohupredireciona stdoutpara nohup.oute stderrpara stdout.
  • 2>nohup.outcoloca stderrno arquivo também.
  • O && rm || catirá limpar em caso de sucesso ou gerar o erro em nohup.outcaso de erro. Você pode adicionar qualquer tratamento de erros que desejar em vez de/incluí-lo catou remover tudo isso e lidar $?normalmente.
  • Você precisará ser um pouco mais esperto sobre a localização do arquivo temporário se usar isso a sério ( mktemp -d)

BSD

No BSD você pode redirecionar stdinpara cpqual será tratado como ne retornar um status diferente de 0.

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

OSX

No OSX cpse comporta de maneira diferente do BSD, surpreendentemente, e retorna um status diferente de 0 -nem um arquivo ignorado.

$ cp -n foo/* bar/

informação relacionada