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?
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?
Respostas:
Retirado da página de manual :
-n, --no-clobber
do not overwrite an existing file (overrides a previous -i option)
Exemplo:
cp -n myoldfile.txt mycopiedfile.txt
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
.
rsync -a -v --ignore-existing src dst
Conforme comentários rsync -a -v src dst
não está correto, porque ele atualizará os arquivos existentes.
--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 de cp -u
acima.
Isso funcionará no RedHat:
false | cp -i source destination 2>/dev/null
Atualizar e não substituir é algo diferente.
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.
-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 (e false | cp -i ...
também), portanto, a solução que funciona no meu caso que eu encontrei é:
if [ ! -f env.js ]; then cp env.example.js env.js; fi
No exemplo acima, se o env.js
arquivo não existir, copiaremos env.example.js
para env.js
.