Tengo una carpeta llamada statistics
en un servidor Ubuntu en el que los archivos de datos se almacenan regularmente. ¿Cómo puedo cambiar el nombre de la statistics
carpeta backup-xx
mientras vuelvo a crear la statistics
carpeta para que esté disponible para almacenar nuevos archivos?
Los archivos en la statistics
carpeta son creados por PHP file_put_contents
.
Prefiero cambiar el nombre de la carpeta, ya que hay muchos archivos en la statistics
carpeta.
bash
shell-script
files
rename
Googlebot
fuente
fuente
Respuestas:
Esto cambiaría el nombre del
statistics
directorio existente abackup-xx
, y si eso tiene éxito, continuaría para crear un nuevostatistics
directorio.Para una operación más atómica, considere crear un directorio
statistics-001
(o similar, tal vez reemplazándolo001
con la fecha de hoy en un formato adecuado), y un enlace simbólico llamadostatistics
:Cuando desee "rotar" esto para que los datos nuevos entren en un directorio limpio, primero cree el directorio y luego vuelva a crear el
statistics
enlace:De esta manera, cualquier programa de escritura para el
statistics
directorio (es decir, el directorio que este vínculo simbólico puntos a) nunca 1 que 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 más bien, de esta manera, el tiempo que un programa estaría sin un directorio de destino válido se minimiza tanto como sea prácticamente posible utilizando herramientas estándar de Unix.
fuente
chown --reference=backup-xx statistics ; chmod --reference=backup-xx statistics
establecer una propiedad y permisos. Idealmente, haría esto antes de cambiar el nombre, por lo que es unmkdir new ; chown ; chmod ; mv stats backup ; mv new stats
proceso de tipoln -sf
No es atómico. Se especifica para desvincular el antiguo enlace simbólico y luego crear uno nuevo, que necesariamente no es atómico. En su lugar, debe hacer un enlace simbólico temporal adicional y utilizar larename
función (a través delmv
comando, por ejemplo) para reemplazar atómicamente el antiguo. Vea mi enfoque aquí: git.musl-libc.org/cgit/musl/tree/tools/…No hay forma de reemplazar atómicamente un directorio por otro directorio. Puede mover el directorio anterior y luego crear un nuevo directorio:
Pero esto deja una pequeña ventana de tiempo durante la cual
statistics
no existe. Este es un problema si algún proceso puede soltar archivos en el directorio en cualquier momento.Para reemplazar de manera atómica un directorio, debe usar enlaces simbólicos. Cree un directorio cuyo nombre incluya el período de tiempo desde el inicio:
(o como quiera elegir la convención de nomenclatura de directorios). Cree un enlace simbólico con un nombre fijo a la ubicación actual:
Para reemplazar el directorio, primero cree un nuevo directorio y un nuevo enlace simbólico, y luego muévalo para sobrescribir el viejo enlace simbólico. Tenga en cuenta que ni un plano
mv
en el enlace simbólico ni un planoln -s
harán esto: crearían una entrada dentro del directorio de destino. GNU coreutilsln -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 usar GNU coreutilsmv -T
en el nuevo enlace simbólico.fuente
busybox
'ln -sf
tampoco es atómico, no sé de ninguna implementación que sea.openat()
o CWD). Solo movería el contenido del directorio a uno nuevo. Eso todavía no es seguro con respecto a los archivos abiertos, pero es un poco mejor. En caso de duda, utilice lologrotate
que debería respetar tales problemas lo mejor posible.symlink
llamada al sistema no sobrescribirá un archivo existente, por lo que es imposible cambiar directamente un enlace simbólico atómicamente, desafortunadamente. Larename
llamada al sistema sobrescribirá un archivo existente, pero molestamente no hay una forma portátil de hacerlo en el shell; es posible con GNU coreutils gracias a la-T
opción.No cambie el nombre del directorio en absoluto. Dijiste que prefieres renombrar el directorio porque tiene muchos archivos. La única razón por la que puedo pensar que querrías esto es porque copiar los archivos llevaría demasiado tiempo. Sin embargo, mover (es decir, renombrar) 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 comocp
si esté moviendo un directorio o su contenido.Entonces, solo haz:
Si también necesita obtener archivos ocultos, puede hacer:
O, si se utiliza
bash
:De esta manera, el directorio siempre está ahí, pero aún puede mover su contenido en una operación simple y rápida.
fuente
Puede mover el contenido de la carpeta de estadísticas a un directorio recién creado en lugar de mover la carpeta en sí. Si mueve toda la carpeta, deberá ejecutar otro comando para cambiar los permisos del directorio.
fuente