
Eu tenho uma pasta chamada statistics
em um servidor Ubuntu na qual os arquivos de dados são armazenados regularmente. Como posso renomear statistics
a pasta backup-xx
enquanto a recrio statistics
para ficar disponível para armazenar novos arquivos?
Os arquivos na statistics
pasta são criados por PHP file_put_contents
.
Prefiro renomear a pasta, pois há muitos arquivos nela statistics
.
Responder1
Não há comoatomicamentesubstitua 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. Isso é um problema se algum processo puder descartar arquivos no diretório a qualquer momento.
Para substituir atomicamente um diretório de forma eficaz, 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ê deseja escolher a convenção de nomenclatura do diretório). Crie um link simbólico com 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 simples mv
no link simbólico nem um simples ln -s
farão isso: eles criariam uma entrada dentro do diretório de destino. O coreutils do GNU ln -snf
também 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 os coreutils do GNU mv -T
no novo link simbólico.
new_dir="statistics-$(date +%Y%m%d)"
mkdir "$new_dir"
ln -s statistics.new
mv -Tf statistics.new statistics
Responder2
mv statistics backup-xx && mkdir statistics
Isso renomearia o statistics
diretório existente para backup-xx
e, se fosse bem-sucedido, continuaria a criar um novo statistics
diretório.
Para uma operação mais atômica, considere criar um diretório statistics-001
(ou similar, talvez substituindo 001
pela data de hoje em um formato adequado) e um link simbólico para ele chamado statistics
:
mkdir statistics-001
ln -s statistics-001 statistics
Quando você quiser "girar" isso para que novos dados entrem em um diretório limpo, crie o diretório primeiro e depois recrie o statistics
link para ele:
mkdir statistics-002
ln -sf statistics-002 statistics
mv statistics-001 backup-001
Desta forma, qualquer programa que escreva no statistics
diretório (isto é, o diretório para o qual este link simbólico aponta) nunca deixará de encontrá-lo.
Se você precisar de permissões especiais ou propriedade definida no diretório para o qual statistics
aponta, defina-as antes de (re)criar o link.
1 Ou melhor, desta forma, o tempo que um programa ficariasemum diretório de destino válido é minimizado tanto quanto possível usando ferramentas Unix padrão.
Responder3
Não renomeie o diretório. Você disse que prefere renomear o diretório porque ele contém muitos arquivos. A única razão pela qual consigo pensar que você desejaria isso é porque copiar os arquivos demoraria muito. No entanto,em movimento(ou seja, renomear) os arquivos é instantâneo, desde que sejam movidos para um local no mesmo sistema de arquivos. Presumo que é isso que você deseja fazer, pois se estiver alterando sistemas de arquivos, mv
isso levará tanto tempo quanto cp
não importa se está movendo um diretório ou seu conteúdo.
Então, basta fazer:
mkdir backup-xx && mv statistics/* backup-xx
Se você também precisar obter arquivos ocultos, você pode fazer:
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 de uma forma simples e rápida.
Responder4
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, terá que executar outro comando para alterar as permissões do diretório.
mkdir -p <path>/backup-xxx
mv statistics/* <path>/backup-xxx/.