Como mover e recriar uma pasta ao mesmo tempo?

Como mover e recriar uma pasta ao mesmo tempo?

Eu tenho uma pasta chamada statisticsem um servidor Ubuntu na qual os arquivos de dados são armazenados regularmente. Como posso renomear statisticsa pasta backup-xxenquanto a recrio statisticspara ficar disponível para armazenar novos arquivos?

Os arquivos na statisticspasta 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 statisticsnã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 mvno link simbólico nem um simples ln -sfarão isso: eles criariam uma entrada dentro do diretório de destino. O coreutils do GNU ln -snftambé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 -Tno 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 statisticsdiretório existente para backup-xxe, se fosse bem-sucedido, continuaria a criar um novo statisticsdiretório.

Para uma operação mais atômica, considere criar um diretório statistics-001(ou similar, talvez substituindo 001pela 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 statisticslink para ele:

mkdir statistics-002
ln -sf statistics-002 statistics

mv statistics-001 backup-001

Desta forma, qualquer programa que escreva no statisticsdiretó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 statisticsaponta, 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, mvisso levará tanto tempo quanto cpnã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/.

informação relacionada