Eu tenho uma pasta chamada statistics
em um servidor Ubuntu na qual os arquivos de dados são armazenados regularmente. Como posso renomear a statistics
pasta para backup-xx
recriar a statistics
pasta para estar disponível para armazenar novos arquivos?
Os arquivos na statistics
pasta são criados pelo PHP file_put_contents
.
Eu prefiro renomear a pasta, pois há muitos arquivos na statistics
pasta.
bash
shell-script
files
rename
Googlebot
fonte
fonte
Respostas:
Isso renomeia o
statistics
diretório existente parabackup-xx
e, se for bem-sucedido, continuará criando um novostatistics
diretório.Para uma operação mais atômica, considere criar um diretório
statistics-001
(ou similar, talvez substituindo pela001
data de hoje em um formato adequado) e um link simbólico para ele chamadostatistics
:Quando você deseja "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:Desta forma, qualquer programa escrito para o
statistics
diretório (ou seja, o diretório que este link simbólico aponta para) nunca 1 não conseguem encontrá-lo.Se você precisar de permissões especiais ou de propriedade definidas no diretório que
statistics
aponta para, defina-as antes de (re) criar o link.1 Ou melhor, dessa forma, o tempo que um programa ficaria sem um diretório de destino válido é minimizado o máximo possível na prática, usando as ferramentas padrão do Unix.
fonte
chown --reference=backup-xx statistics ; chmod --reference=backup-xx statistics
definir propriedades e permissões. Idealmente, você faria isso antes de renomear, para ummkdir new ; chown ; chmod ; mv stats backup ; mv new stats
processo de tipo.ln -sf
não é atômico. É especificado para desvincular o link simbólico antigo e criar um novo, que é necessariamente não atômico. Em vez disso, você deve criar um vínculo simbólico temporário adicional e usar arename
função (viamv
comando, por exemplo) para substituir atomicamente o antigo. Veja minha abordagem aqui: git.musl-libc.org/cgit/musl/tree/tools/…Não há como substituir atomicamente um diretório por outro diretório. Você pode mover o diretório antigo e criar um novo diretório:
Mas isso deixa uma pequena janela de tempo durante a qual
statistics
não existe. Este é um problema se algum processo puder soltar arquivos no diretório a qualquer momento.Para efetivamente substituir atomicamente um diretório, você precisa usar links simbólicos. Crie um diretório cujo nome inclua o período desde o início:
(ou no entanto você deseja escolher a convenção de nomenclatura de diretório). Crie um link simbólico com um nome fixo para o local atual:
Para substituir o diretório, primeiro crie um novo diretório e um novo link simbólico e mova-o para substituir o link simbólico antigo. Observe que nem uma planície
mv
no link simbólico nem uma planícieln -s
farão isso: elas criariam uma entrada dentro do diretório de destino. O coreutils do GNUln -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 GNU coreutilsmv -T
no novo link simbólico.fonte
busybox
'ln -sf
também não é atômico, não conheço nenhuma implementação que seja.openat()
ou CWD). Gostaria apenas de mover o conteúdo do diretório para um novo. Isso ainda é inseguro em relação aos arquivos abertos, mas um pouco melhor. Em dúvida, use ologrotate
que deve respeitar da melhor maneira possível essas questões.symlink
chamada do sistema não substituirá um arquivo existente, por isso é impossível trocar diretamente um link simbólico atomicamente, infelizmente. Arename
chamada do sistema substituirá um arquivo existente, mas irritantemente não há uma maneira portátil de fazer isso no shell; é possível com o GNU coreutils graças à-T
opçãoNão renomeie o diretório. Você disse que prefere renomear o diretório porque ele possui muitos arquivos. A única razão pela qual consigo pensar que você deseja isso é porque a cópia dos arquivos levaria muito tempo. No entanto, mover (ou seja, renomear) os arquivos é instantâneo, desde que sejam movidos para um local no mesmo sistema de arquivos. Suponho que é isso que você deseja fazer, pois, se você estiver alterando os sistemas de arquivos,
mv
levará tanto tempo quanto acp
movimentação de um diretório ou seu conteúdo.Então, faça:
Se você também precisar obter arquivos ocultos, poderá:
Ou, se estiver usando
bash
:Dessa forma, o diretório está sempre lá, mas você ainda move seu conteúdo em uma operação simples e rápida.
fonte
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 uma pasta inteira, precisará executar outro comando para alterar as permissões do diretório.
fonte