Como mover e recriar uma pasta ao mesmo tempo?

9

Eu tenho uma pasta chamada statistics em um servidor Ubuntu no qual os arquivos de dados são armazenados regularmente. Como posso renomear a pasta statistics para backup-xx ao recriar a pasta statistics para estar disponível para armazenar novos arquivos?

Os arquivos na pasta statistics são criados pelo PHP file_put_contents .

Eu prefiro renomear a pasta, pois há muitos arquivos na pasta statistics .

    
por Googlebot 29.04.2017 / 14:01

4 respostas

7
mv statistics backup-xx && mkdir statistics

Isso renomearia o diretório statistics existente para backup-xx e, se isso for bem-sucedido, continuará criando um novo diretório statistics .

Para uma operação mais atômica, considere a criação de um diretório statistics-001 (ou similar, talvez substituindo 001 pela data de hoje em um formato adequado) e um link simbólico chamado statistics :

mkdir statistics-001
ln -s statistics-001 statistics

Quando você quiser "girar" isso para que os novos dados entrem em um diretório limpo, crie o diretório primeiro e recrie o link statistics :

mkdir statistics-002
ln -sf statistics-002 statistics

mv statistics-001 backup-001

Dessa forma, qualquer programa gravando no diretório statistics (ou seja, o diretório para o qual esse link simbólico aponta) nunca irá 1 falhar em encontrá-lo.

Se você precisar de permissões especiais ou propriedade definida no diretório para o qual statistics aponta, configure-os antes de (re) criar o link.

1 Ou melhor, desta forma, o tempo que um programa seria sem um diretório de destino válido é minimizado o máximo possível usando ferramentas padrão do Unix .

    
por 29.04.2017 / 14:05
12

Não há como atuar substituir um diretório por outro diretório. Você pode mover o diretório antigo e criar um novo diretório:

mv statistics backup-xx
mkdir statistics

Mas isso deixa uma pequena janela de tempo durante a qual statistics não existe. Este é um problema se algum processo deixar os arquivos no diretório a qualquer momento.

Para substituir de forma eficiente um diretório, você precisa usar links simbólicos. Crie um diretório cujo nome inclua o período desde o início:

mkdir "statistics-$(date +%Y%m%d)"

(ou como você quiser escolher a convenção de nomenclatura do diretório). Crie um link simbólico com um nome fixo para o local atual:

ln -s … statistics

Para substituir o diretório, primeiro crie um novo diretório e um novo link simbólico e, em seguida, mova-o para substituir o antigo link simbólico. Observe que nem um mv simples no link simbólico nem um ln -s simples farão isso: eles criariam uma entrada dentro do diretório de destino. O ln -snf do GNU coreutils não é adequado porque remove o link simbólico existente antes de criar um novo, o que deixa uma pequena janela de tempo durante a qual o caminho não existe. Você pode usar mv -T do GNU coreutils no novo link simbólico.

new_dir="statistics-$(date +%Y%m%d)"
mkdir "$new_dir"
ln -s statistics.new
mv -Tf statistics.new statistics
    
por 29.04.2017 / 14:21
3

Não renomeie o diretório. Você disse que prefere renomear o diretório porque ele tem muitos arquivos. A única razão pela qual eu posso pensar que você iria querer isso é porque copiar os arquivos levaria muito tempo. No entanto, mover (ou seja, renomear) os arquivos é instantâneo, desde que eles sejam movidos para um local no mesmo sistema de arquivos. Eu suponho que isso é o que você deve fazer, pois se você estiver alterando os sistemas de arquivos, mv levará tanto tempo quanto cp , independentemente de estar movendo um diretório ou seu conteúdo.

Então, faça:

mkdir backup-xx && mv statistics/* backup-xx

Se você precisar também de arquivos ocultos, faça:

mkdir backup-xx && mv statistics/* statistics/.* backup-xx

Ou, se estiver usando bash :

shopt -s dotglob; mkdir backup-xx && mv statistics/* statistics/.* backup-xx

Desta forma, o diretório está sempre lá, mas você ainda move seu conteúdo em uma operação simples e rápida.

    
por 30.04.2017 / 02:45
1

Você pode mover o conteúdo da pasta de estatísticas para um diretório recém-criado, em vez de mover a própria pasta. Se você mover a pasta inteira, você teria que executar outro comando para alterar as permissões do diretório.

mkdir -p <path>/backup-xxx
mv statistics/* <path>/backup-xxx/.
    
por 29.04.2017 / 16:49