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 cp
não sobrescrever os arquivos existentes ou -i
para perguntar interativamente se devo sobrescrever os arquivos.
Questões
- Existe uma maneira de falhar
cp
e retornar um código de erro se o arquivo já existir? - Se não, é possível fazer isso com
rsync
alguma outra ferramenta comum?
Responder1
Linux
É possível falhar se existir um arquivo no Linux, através de um leve hack com GNU nohup
. nohup
redireciona /dev/null
para stdin
que quaisquer prompts interativos sejam 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
redirecionastdout
paranohup.out
estderr
parastdout
. 2>nohup.out
colocastderr
no arquivo também.- O
&& rm || cat
irá limpar em caso de sucesso ou gerar o erro emnohup.out
caso de erro. Você pode adicionar qualquer tratamento de erros que desejar em vez de/incluí-locat
ou 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 stdin
para cp
qual 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 -n
em um arquivo ignorado.
$ cp -n foo/* bar/