cp na hierarquia de destino com link simbólico?

4

Estou tentando escrever um script de implantação de site que copie arquivos assim:

SOURCE

.
..
src/
html/

DEST

.
..
src/
html/ -> /var/www/ftproot/mysite

Eu quero os arquivos em SOURCE html para ir para DEST /var/www/ftproot/mysite .

O script foi:

cd SOURCE
cp -Rf * DEST

Sempre que executo o script, recebo este erro:

cp: cannot overwrite non-directory 'html' with directory 'html'

A partir disso, deduzo que cp não pode copiar arquivos automaticamente para o DEST quando o DEST possui links simbólicos.

Notas:

  1. Seguindo o manual do cp , eu defino POSIXLY_CORRECT para 1. Isso não funciona.

  2. Eu tive que linkar o site html para ftproot/mysite e não vice-versa, porque os usuários do ftp têm modos de acesso estranhos.

  3. Esse cara modificou cp do código-fonte e o recompilou. Eu não quero fazer isso em um servidor de produção.

Alguma idéia de como resolver isso?

    
por est 14.01.2013 / 04:23

2 respostas

5

para qualquer cópia de arquivo Eu sugiro rsync over cp porque tem um controle muito melhor do que deve ser copiado e como. No seu caso, basta dar os comandos:

cd SOURCE
rsync -K -a . DEST

A opção -K faz exatamente o que você deseja: -K, --keep-dirlinks tratam o dir symlinked no receptor como dir

    
por 14.01.2013 / 06:13
2

Como o cp não copia nenhum diretório no SOURCE sobre qualquer link simbólico no DEST, uma opção é copiar esses diretórios separadamente para cada link simbólico.

Abordagem usando o achado

cd DEST
cp -Rf SOURCE/* .
find -type l -exec bash -c 'cp -Rf "SOURCE/$0"/* "$0"' {} \;

Detalhes

  • -type l restringe a localização a links simbólicos.
  • -exec bash -c '...' {} \; executa ... em um subshell bash para cada link simbólico encontrado, passando {} (o caminho relativo para o symlink) como argumento fitst ( $0 ).
  • cp -Rf "SOURCE/$0"/* "$0" copia o conteúdo do diretório de origem correspondente no diretório para o qual o link simbólico aponta.
  • O comando cp deve ser chamado usando o bash, então o glob (asterisco) será expandido.

Cuidados

  • Sugiro substituir cp por echo (ou -Rf por -Ri ) para ter certeza de que encontrar o que você espera.
  • Sem conhecer a estrutura de diretórios exata e os links simbólicos presentes no DEST, não posso garantir que previ todas as esquisitices possíveis.
por 14.01.2013 / 05:22