Movendo pastas na inconsistência do Linux

0

Eu tenho um script de shell que implanta um aplicativo em um servidor de temporariedade. No entanto, um dos diretórios do aplicativo precisa ser submetido a backup e restaurado após a implantação (para que não seja sobrescrito). Eu consigo fazer o backup do diretório, mas a parte de restauração não se comporta como esperado. Basicamente, aqui estão as duas linhas no script de shell:

...
# backup user avatars
mv vitex/app/modules/users/pub/img/users/ ~/tmp/img-users.BAK/ &> /dev/null

...
# restore user avatars
mv ~/tmp/img-users.BAK/ vitex/app/modules/users/pub/img/users/ &> /dev/null

O problema é que o primeiro comando cria a pasta correta em ~/tmp/ , mas o segundo comando cria vitex/app/modules/users/pub/img/users/img-users.BAK/ , o que não é bom.

O comportamento esperado seria que img-users.BAK moveria todos os arquivos de volta, sobrescrevendo quaisquer arquivos na pasta de destino, deixando quaisquer outros arquivos intactos.

Como isso pode ser feito?

Obrigado!

Observação : a recursividade não é necessária, pois não há diretório sob esse caminho.

** Editar **

Etapa 1: diretório de backup

Antes

./vitex/app/modules/users/pub/img/
  ./users/
    ./1.png
    ./14.png
    ./README
    ...
./tmp/
  <empty>

Depois de

./vitex/app/modules/users/pub/img/
   <empty>
 ./tmp/
   ./img-users.BAK/
    ./1.png
    ./14.png
    ./README
    ...

Tudo é como esperado.

Etapa 2: restaurar diretório

Antes

./vitex/app/modules/users/pub/img/
  ./users/
    ./1.png
    ./3.png
    ./README
    ...
./tmp/
  ./img-users.BAK/
    ./1.png
    ./14.png
    ./README
    ...

Após (real)

./vitex/app/modules/users/pub/img/
  ./users/
    ./img-users.BAK/
      ./1.png
      ./14.png
      ./README
      ...
    ./3.png
    ./1.png
    ./README
    ...
./tmp/
  <empty>

Após (esperado)

./vitex/app/modules/users/pub/img/
  ./users/
    ./1.png        <-- overwritten
    ./14.png
    ./3.png
    ./README       <-- overwritten
    ...
./tmp/
  <empty>
    
por Yanick Rochon 17.09.2014 / 17:33

3 respostas

2

Os comandos que você emitiu estão fazendo exatamente a coisa certa, ou seja, movendo diretórios . Se você precisar mover ou copiar os arquivos no diretório img/users , faça isso explicitamente:

mv -f ~/tmp/img-users.BAK/* vitex/app/modules/users/pub/img/users/

Observe que incluí o -f que forçará a substituição sem perguntar. Seja cuidadoso. Além disso, não tenho certeza por que você quer jogar fora STDOUT, então eu deixei isso também.

    
por 17.09.2014 / 17:45
1

A diferença é que no primeiro caso, o destino não existe e já existe no segundo.

mv ~/tmp/img-users.BAK/ vitex/app/modules/users/pub/img/users/

O segundo comando move todos os últimos arquivos, exceto o último, para o último diretório, portanto, é necessário listar todos os arquivos a serem movidos. Você pode fazer isso com globbing:

mv ~/tmp/img-users.BAK/* vitex/app/modules/users/pub/img/users/

Como nota lateral (importante), você deve evitar ter um / no final do diretório de origem. Pode ter efeitos colaterais muito estranhos e não é de muita utilidade, de qualquer forma:

De pinfo mv :

**Warning**: Avoid specifying a source name with a trailing slash,
when it might be a symlink to a directory.  Otherwise, 'mv' may do
something very surprising, since its behavior depends on the underlying
rename system call.  On a system with a modern Linux-based kernel, it
fails with 'errno=ENOTDIR'.  However, on other systems (at least
FreeBSD 6.1 and Solaris 10) it silently renames not the symlink but
rather the directory referenced by the symlink. 
    
por 17.09.2014 / 17:42
0

Se o estágio intermediário entre o backup e a restauração estiver recriando o diretório users (como parece ser o caso), para restaurá-lo, será necessário renomear os arquivos individuais foi mostrado nas respostas anteriores, embora eu possa argumentar que pode não ser o que você quer) ou, no script restore , remover o diretório users antes de movê-lo de volta para o lugar, portanto, com backup permanecendo o mesmo (exceto para considerar a questão da barra de trailing mencionada na resposta por Volker Siegel:

...
# backup user avatars
mv vitex/app/modules/users/pub/img/users ~/tmp/img-users.BAK

Você adicionaria um comando a restore , como:

...
# restore user avatars
rm -rf vitex/app/modules/users/pub/img/users
mv ~/tmp/img-users.BAK vitex/app/modules/users/pub/img/users

Eu também removi o redirecionamento para /dev/null , porque acho que no caso típico você não precisará dele (o mv ficará em silêncio), enquanto se algo estranho acontecer, você receberá as mensagens de erro que poderia ser útil para descobrir o que aconteceu.

    
por 18.09.2014 / 03:36