¿Cómo mover y recrear una carpeta al mismo tiempo?

¿Cómo mover y recrear una carpeta al mismo tiempo?

Tengo una carpeta llamada statisticsen un servidor Ubuntu en la que se almacenan regularmente los archivos de datos. ¿Cómo puedo cambiar el nombre statisticsde la carpeta backup-xxmientras vuelvo a crear statisticsla carpeta para que esté disponible para almacenar nuevos archivos?

Los archivos en statisticsla 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 statisticsno 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 mven el enlace simbólico ni un simple ln -sharán esto: crearían una entrada dentro del directorio de destino. GNU coreutils ln -snftampoco 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 -Ten 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 statisticsdirectorio existente a backup-xxy, si tiene éxito, continuaría creando un nuevo statisticsdirectorio.

Para una operación más atómica, considere crear un directorio statistics-001(o similar, tal vez reemplazándolo 001con 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 statisticsenlace:

mkdir statistics-002
ln -sf statistics-002 statistics

mv statistics-001 backup-001

De esta manera, cualquier programa que escriba en el statisticsdirectorio (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 statisticsapunta, 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, mvtomará tanto tiempo como cpsi 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/.

información relacionada