Copie o diretório, mas falhe se o arquivo já existir no destino

2

cp -a foo/* bar/ irá copiar o conteúdo de foo na barra, substituindo quaisquer arquivos que já existam. Eu posso usar o sinalizador -n para fazer com que cp não sobrescreva os arquivos existentes ou -i para fazer com que ele pergunte de forma interativa se os arquivos devem ser sobrescritos.

Perguntas

  • Existe uma maneira de fazer cp falhar e retornar um código de erro se o arquivo já existir?
  • Se não, é possível fazer com rsync ou alguma outra ferramenta comum?
por Shum 09.05.2014 / 08:38

1 resposta

4

Linux

É possível falhar se um arquivo existir no Linux, através de um pequeno hack com GNU nohup . nohup redireciona /dev/null para stdin , portanto, todos os prompts interativos são ignorados, mas trata o uso de stdin como 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, nohup redireciona stdout para nohup.out e stderr para stdout .
  • 2>nohup.out coloca stderr no arquivo também.
  • O && rm || cat limpará o sucesso ou gerará o erro de nohup.out no erro. Você pode adicionar qualquer tratamento de erro desejado em vez de / incluindo o cat ou remover tudo isso e lidar com $? como normal.
  • Você precisará ser um pouco mais inteligente sobre o local do arquivo temporário se usar isso de forma séria ( mktemp -d )

BSD

No BSD, você pode redirecionar stdin para cp , que será tratado como n e retornará um status diferente de 0.

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

OSX

No OSX cp se comporta de maneira diferente do BSD, surpreendentemente, e retorna um status diferente de 0 com -n em um arquivo ignorado.

$ cp -n foo/* bar/
    
por 09.05.2014 / 13:18

Tags