cp não sobrescreve arquivos existentes

3

Estou copiando arquivos de um repositório git para uma pasta virtualhost, embora nenhum dos seguintes comandos substitua arquivos existentes:

sudo cp -R /home/git/repo /var/www/website
sudo cp -R -f /home/git/repo /var/www/website

Como posso ter certeza de que o comando cp sobrescreve os arquivos existentes?


Edit: Teste rápido, copiar arquivos do webdir para o repo sobrescreve arquivos, então aparentemente algo ( www-data? ) está bloqueando os arquivos no webdir. A mount output:

~$ mount | column -t
sysfs       on  /sys                             type  sysfs       (rw,nosuid,nodev,noexec,relatime)
proc        on  /proc                            type  proc        (rw,nosuid,nodev,noexec,relatime)
udev        on  /dev                             type  devtmpfs    (rw,nosuid,relatime,size=1005964k,nr_inodes=251491,mode=755)
devpts      on  /dev/pts                         type  devpts      (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs       on  /run                             type  tmpfs       (rw,nosuid,noexec,relatime,size=204840k,mode=755)
/dev/vda1   on  /                                type  ext4        (rw,relatime,errors=remount-ro,data=ordered)
securityfs  on  /sys/kernel/security             type  securityfs  (rw,nosuid,nodev,noexec,relatime)
tmpfs       on  /dev/shm                         type  tmpfs       (rw,nosuid,nodev)
tmpfs       on  /run/lock                        type  tmpfs       (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs       on  /sys/fs/cgroup                   type  tmpfs       (ro,nosuid,nodev,noexec,mode=755)
cgroup      on  /sys/fs/cgroup/systemd           type  cgroup      (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)
pstore      on  /sys/fs/pstore                   type  pstore      (rw,nosuid,nodev,noexec,relatime)
cgroup      on  /sys/fs/cgroup/hugetlb           type  cgroup      (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup      on  /sys/fs/cgroup/freezer           type  cgroup      (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup      on  /sys/fs/cgroup/cpu,cpuacct       type  cgroup      (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup      on  /sys/fs/cgroup/memory            type  cgroup      (rw,nosuid,nodev,noexec,relatime,memory)
cgroup      on  /sys/fs/cgroup/devices           type  cgroup      (rw,nosuid,nodev,noexec,relatime,devices)
cgroup      on  /sys/fs/cgroup/net_cls,net_prio  type  cgroup      (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup      on  /sys/fs/cgroup/pids              type  cgroup      (rw,nosuid,nodev,noexec,relatime,pids)
cgroup      on  /sys/fs/cgroup/blkio             type  cgroup      (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup      on  /sys/fs/cgroup/cpuset            type  cgroup      (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup      on  /sys/fs/cgroup/perf_event        type  cgroup      (rw,nosuid,nodev,noexec,relatime,perf_event)
systemd-1   on  /proc/sys/fs/binfmt_misc         type  autofs      (rw,relatime,fd=27,pgrp=1,timeout=0,minproto=5,maxproto=5,direct)
debugfs     on  /sys/kernel/debug                type  debugfs     (rw,relatime)
mqueue      on  /dev/mqueue                      type  mqueue      (rw,relatime)
hugetlbfs   on  /dev/hugepages                   type  hugetlbfs   (rw,relatime)
fusectl     on  /sys/fs/fuse/connections         type  fusectl     (rw,relatime)
tmpfs       on  /run/user/1000                   type  tmpfs       (rw,nosuid,nodev,relatime,size=204840k,mode=700,uid=1000,gid=1000)

E:

df -h /var/www
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        30G   20G  8.9G  69% /
    
por Kurt Van den Branden 19.10.2016 / 08:47

5 respostas

3

Em vez de cp , prefiro usar tar para a árvore grande ..

Sim, eu uso quase nunca cp -r syntaxe (exceto para backups hardlinking, com cp -al , mas é muito específico).

A sintaxe do tar permite muitas configurações para copiar uma grande árvore, sobre o que pode ou não ser copiado (quais arquivos, permissões, proprietário ...) veja man tar .

Eu prefiro estar familiarizado com o comando tar :

No host local:

 tar -cpC /path/to/source . | tar -xpC /path/to/target

(observe o ponto . que especifica o que salvar ).

Estar familiarizado com tar pode ser útil para cópia remota:

ssh user@remotesource tar -zcpC /path/to/source . | tar -zxpC /path/to/target

ou

tar -zcpC /path/to/source . | ssh user@targethost tar -zxpC /path/to/target

ou até mesmo

ssh user@remotesource tar -zcpC /path/to/source . |
    ssh user@targethost tar -zxpC /path/to/target

Em hosts remotos e / ou diferentes, ao copiar a conta de usuários, você pode gostar de --numeric-owner options ...

  • --one-file-system fica no sistema de arquivos local
  • --overwrite sobrescrever arquivos existentes
  • -T, --files-from FILE obtém nomes para extrair ou criar de FILE
  • -z usa compactação gzip

Em vez de tar , por que não usar cpio

Como imz - Ivan Zakharyaschev comentou, cpio poderia fazer o mesmo, mas não com a mesma sintaxe:

cpio requer uma lista de inode (arquivo, dir, dev, soquete, fifo) que deve ser armazenado em archive para ser enviado por STDIN .

Mas cpio oferece um modo --pass-through que permite copiar o arquivo para outro diretório.

Isso torna a sintaxe mais strong, mas à medida que usamos find para criar essa lista, poderíamos usar o poder de find para copiar exatamente o que precisamos:

cd /path/to/source
find . \( -type f -o -type d \) ! -name '*.foo' -print0 | 
    cpio --null -pvd /path/to/destination

Usado remotamente, você pode:

ssh user@remotesource /bin/sh <<<'cd /path/to/source;
    find . \( -type f -o -type d \) ! -name '*.foo' -print0 |
    cpio --null -o |
    gzip' |
  ssh user@targethost 'cd /path/to/destination && gunzip | cpio -id'
    
por 21.10.2016 / 11:50
2

Parece que você quer que os arquivos acabem em /var/www/website/index.html , mas com a sintaxe acima, eles acabarão em /var/www/website/repo/index.html .

Você pode verificar se isso está realmente acontecendo, verificando se você tem um diretório /var/www/website/repo/ com novos arquivos.

A solução seria usar algo como cp -R source/* dest/ , ou talvez um rsync -a source/ dest/ para ser mais eficiente.

    
por 22.10.2016 / 21:58
1

Como você está executando isso como root (usando sudo ), você verificou se existe um alias para cp em .bashrc ou .profile da raiz? Algo como:

alias cp="cp -i"

Tente executar os comandos com ' \ ', assim:

sudo \cp -R /home/git/repo /var/www/website

O \ em \cp fará com que cp seja executado sem nenhum alias.

    
por 19.10.2016 / 08:57
1

Permissões e propriedade podem ser importantes em seus arquivos, mas se você não precisar de nada além de 644 e 755 do mesmo proprietário, basta fazer o check-out diretamente do Git:

git --git-dir=/home/git/repo/.git --work-tree=/var/www/website checkout -f HEAD

O sinalizador -f força o checkout, fazendo com que o Git sobrescreva quaisquer alterações em /var/www/website com a versão salva no Git.

HEAD é, claro, o ponteiro para a ideia de Git do commit "atual".

Você também pode explorar o comando git worktree , mas como você não estará fazendo desenvolvimento em /var/www/website , o acima é provavelmente mais apropriado.

    
por 26.10.2016 / 03:51
0

Eu recomendo tentar sudo cp -Rf /home/git/repo/* /var/www/website , eu sempre tive melhor sorte ao copiar o conteúdo dos diretórios em vez dos diretórios.

    
por 26.10.2016 / 02:51

Tags