
Tengo una carpeta llamada statistics
en un servidor Ubuntu en la que se almacenan regularmente los archivos de datos. ¿Cómo puedo cambiar el nombre statistics
de la carpeta backup-xx
mientras vuelvo a crear statistics
la carpeta para que esté disponible para almacenar nuevos archivos?
Los archivos en statistics
la carpeta son creados por PHP file_put_contents
.
Prefiero cambiar el nombre de la carpeta, ya que hay muchos archivos en ella statistics
.
Respuesta1
No hay manera deatómicamentereemplazar un directorio por otro directorio. Puede mover el directorio antiguo y luego crear un directorio nuevo:
mv statistics backup-xx
mkdir statistics
Pero esto deja una pequeña ventana de tiempo durante la cual statistics
no existe. Esto es un problema si algún proceso puede colocar archivos en el directorio en cualquier momento.
Para reemplazar atómicamente un directorio de manera efectiva, debe usar enlaces simbólicos. Cree un directorio cuyo nombre incluya el período de tiempo desde el inicio:
mkdir "statistics-$(date +%Y%m%d)"
(o como quiera elegir la convención de nomenclatura del directorio). Cree un enlace simbólico con un nombre fijo a la ubicación actual:
ln -s … statistics
Para reemplazar el directorio, primero cree un nuevo directorio y un nuevo enlace simbólico y luego muévalo para sobrescribir el antiguo enlace simbólico. Tenga en cuenta que ni un enlace simple mv
en el enlace simbólico ni un simple ln -s
harán esto: crearían una entrada dentro del directorio de destino. GNU coreutils ln -snf
tampoco es adecuado porque elimina el enlace simbólico existente antes de crear uno nuevo, lo que deja una pequeña ventana de tiempo durante la cual la ruta no existe. Puede utilizar GNU coreutils mv -T
en el nuevo enlace simbólico.
new_dir="statistics-$(date +%Y%m%d)"
mkdir "$new_dir"
ln -s statistics.new
mv -Tf statistics.new statistics
Respuesta2
mv statistics backup-xx && mkdir statistics
Esto cambiaría el nombre del statistics
directorio existente a backup-xx
y, si tiene éxito, continuaría creando un nuevo statistics
directorio.
Para una operación más atómica, considere crear un directorio statistics-001
(o similar, tal vez reemplazándolo 001
con la fecha de hoy en un formato adecuado) y un enlace simbólico llamado statistics
:
mkdir statistics-001
ln -s statistics-001 statistics
Cuando desee "rotar" esto para que los datos nuevos vayan a un directorio limpio, primero cree el directorio y luego vuelva a crear el statistics
enlace:
mkdir statistics-002
ln -sf statistics-002 statistics
mv statistics-001 backup-001
De esta manera, cualquier programa que escriba en el statistics
directorio (es decir, el directorio al que apunta este enlace simbólico) nunca dejará de encontrarlo.
Si necesita permisos especiales o propiedad establecida en el directorio al que statistics
apunta, configúrelos antes de (re)crear el enlace.
1 O mejor dicho, de esta manera, el tiempo que un programa estaríasinun directorio de destino válido se minimiza tanto como sea posible utilizando herramientas estándar de Unix.
Respuesta3
No cambie el nombre del directorio en absoluto. Dijiste que prefieres cambiar el nombre del directorio porque tiene muchos archivos. La única razón por la que se me ocurre que querrías esto es porque copiar los archivos llevaría demasiado tiempo. Sin embargo,Moviente(es decir, cambiar el nombre) los archivos es instantáneo siempre que se muevan a una ubicación en el mismo sistema de archivos. Supongo que esto es lo que debe hacer, ya que si está cambiando los sistemas de archivos, mv
tomará tanto tiempo como cp
si está moviendo un directorio o su contenido.
Entonces, solo haz:
mkdir backup-xx && mv statistics/* backup-xx
Si también necesita obtener archivos ocultos, puede hacer:
mkdir backup-xx && mv statistics/* statistics/.* backup-xx
O, si usa bash
:
shopt -s dotglob; mkdir backup-xx && mv statistics/* statistics/.* backup-xx
De esta manera, el directorio siempre está ahí pero aún puedes mover su contenido en una operación simple y rápida.
Respuesta4
Puede mover el contenido de la carpeta de estadísticas a un directorio recién creado en lugar de mover la carpeta misma. Si mueve la carpeta completa, deberá ejecutar otro comando para cambiar los permisos del directorio.
mkdir -p <path>/backup-xxx
mv statistics/* <path>/backup-xxx/.