Quero cp
um diretório, mas não quero substituir nenhum arquivo existente, mesmo que seja mais antigo que os arquivos copiados. E quero fazê-lo completamente não interativo, pois isso fará parte de um script do Crontab Bash. Alguma ideia?
386
Respostas:
Retirado da página de manual :
Exemplo:
fonte
cp -n source.txt destination.txt || true
cp -n
não sai com erro se o arquivo existir no Ubuntu 12.04.Considere usar
rsync
.Conforme comentários
rsync -a -v src dst
não está correto, porque ele atualizará os arquivos existentes.fonte
--ignore-existing
sinalizador para impedir que os arquivos existentes sejam substituídos.rsync -a -v --ignore-existing <src> <dst>
é realmente a resposta correta, em vez decp -u
acima.É o que você quer. Veja a página do manual.
fonte
Isso funcionará no RedHat:
Atualizar e não substituir é algo diferente.
fonte
false
faz aqui?-i
perguntas.Para pessoas que acham que não tem uma opção 'n' (como eu no RedHat), você pode usar
cp -u
para escrever o arquivo apenas se a fonte for mais nova que a existente (ou se não houver).[editar] Como mencionado nos comentários, isso substituirá os arquivos mais antigos, portanto não é exatamente o que o OP queria. Use a resposta de ceving para isso.
fonte
-u
, na verdade, não se encaixa.Alpine linux: A resposta abaixo é apenas para o caso de um único arquivo: no alpine
cp -n
não está funcionando (efalse | cp -i ...
também), portanto, a solução que funciona no meu caso que eu encontrei é:No exemplo acima, se o
env.js
arquivo não existir, copiaremosenv.example.js
paraenv.js
.fonte
Algumas versões do cp não têm a opção --no-clobber . Nesse caso:
fonte