Cambiar automáticamente el nombre de los archivos cuando se colocan en un directorio específico

14

¿Es posible cambiar automáticamente el nombre de un archivo cuando se coloca en un directorio específico?

Por ejemplo, tengo un directorio llamado "dir0". Muevo o copio un archivo llamado "archivo1" a "dir0". Luego, "archivo1" debería cambiar el nombre a "archivo1_ {marca de tiempo actual}"

Nick.h
fuente
1
Echa un vistazo a inotify ( linux.die.net/man/7/inotify ). Pero, ¿no puede simplemente copiar de inmediato al archivo con el nombre correcto con la marca de tiempo agregada?
alex

Respuestas:

21

Por lo general, haría esto mediante programación al momento de crear o mover el archivo, pero es posible activar un script cada vez que se crea o mueve un archivo a una carpeta incron. Configure su archivo de tabulación incrontab -econ una línea como esta, pero con sus rutas, por supuesto:

/path/to/dir0 IN_MOVED_TO,IN_CREATE /path/to/script $@/$#

Luego, en /path/to/scriptescribir una acción de cambio de nombre rápido. Tenga en cuenta que la secuencia de comandos también se llamará para el nuevo archivo que cree, por lo que debe probar si el archivo ya se ha nombrado correctamente o no. En este ejemplo, verifica si el archivo tiene un número de diez dígitos durante segundos desde la época como la última parte del nombre del archivo, y si no lo tiene, lo agrega:

#!/bin/bash
echo $1 | grep -qx '.*_[0-9]\{10\}' || mv "$1" "$1_$(date +%s)"

Editar: cuando escribí esto por primera vez, tenía poco tiempo y no podía encontrar la manera de hacer bashque el patrón coincida aquí. Gilles señaló cómo hacer esto sin invocar grep usando la coincidencia de ERE en bash:

#!/bin/bash
[[ ! ( $1 =~ _[0-9]{10}$ ) ]] && mv "$1" "$1_$(date +%s)"
Caleb
fuente
5

Creo que inotifyes una herramienta que podría usarse en este caso. En Debian hay una herramienta inoticomingpara ejecutar acciones en la creación de archivos:

 inoticoming --foreground /path/to/directory mv {} {}-"`date`" \;

{} será reemplazado con el nombre del archivo.

El comando que proporcioné no está completo: causa un bucle porque cuando se cambie el nombre del archivo se reconocerá como nuevo, por lo que se volverá a mveditar y así sucesivamente. Para evitar esto, puede usar la --suffixopción si sabe qué sufijo estará en el archivo antes de cambiar el nombre.

pbm
fuente
No hay problema. Nunca he oído hablar de inoticoming. Por curiosidad, ¿cuándo sería mejor usar esto inocron?
Caleb
No sé si es mejor. Lo escuché hace algún tiempo, pero nunca lo intenté ... Ahora encontré una opinión que inoticominges "similar incrond, pero más liviana y no comenzó como un demonio predeterminado", por lo que creo que es solo otra solución con un enfoque ligeramente diferente. .. Creo que incrones más popular - tengo problemas para encontrar inoticoming la página de inicio de un paquete para Debian fuera ...
PBM
Creo que acabas de publicar el enlace equivocado. Mi distribución no parece tenerla en ningún lado.
Caleb
Encontré inoticomingsolo en distribuciones basadas en Debian (en mi Gentoo no hay ebuild para ello). En la página que he publicado, hay dos paquetes: repreproy debajo de ella inoticoming...
PBM
2

Podrías tomar un script como este y ejecutarlo ... Lo dejaré como un ejercicio para que el lector agregue los bits adicionales para que comience como un servicio y evite que se ejecuten varias copias a la vez.

#!/usr/bin/perl
use strict;
use warnings;
use File::Slurp;
use POSIX qw(strftime);

chdir($ENV{STAMP_DIR} || '/home/me/dir0')
    or die "Cannot get to stamp dir: $!\n";

while (1) {
    my $stamp = strftime("_%Y%m%d%H%M%S", localtime);
    for my $orig ( grep { $_ !~ /_\d{14}$/ } read_dir('.') ) {
        rename $orig, "$orig$stamp"
            or warn "Failed to rename $orig to $orig$stamp: $!\n";
    }
    sleep($ENV{STAMP_DELAY} || 10);
}

Y aquí está funcionando:

$ STAMP_DIR=/home/me/stamps STAMP_DELAY=1 ./t.pl &
[1] 6989
$ cd stamps/
$ ls
$ touch hello
$ ls
hello_20110704033253
$ touch world
$ ls
hello_20110704033253
world_20110704033258
$ touch hello
$ ls
hello_20110704033253
hello_20110704033302
world_20110704033258
poco pitón
fuente
Por supuesto, perl puede hacer cualquier cosa, pero una secuencia de comandos persistente que se ejecuta en un bucle X-while while-true es definitivamente un truco cuando puede recibir notificaciones de eventos sobre escrituras de archivos y responder instantáneamente sin perder recursos el resto del tiempo.
Caleb
@Caleb - Muy cierto. Solo dando posibilidades. Por supuesto, si lo hace a través de la notificación del sistema, tiene la posibilidad de obtener dos archivos creados con el mismo nombre en el mismo segundo, por lo que los scripts adjuntos deben manejar esas circunstancias.
antipático el