Rinomina automaticamente i file quando vengono inseriti in una directory specifica


14

È possibile rinominare automaticamente un file quando viene inserito in una directory specifica?

Ad esempio, ho una directory denominata "dir0". Sposta o copia un file denominato "file1" in "dir0". Quindi "file1" deve rinominare in "file1_ {data corrente}}


1
Dai un'occhiata a inotify ( linux.die.net/man/7/inotify ). Ma non puoi semplicemente copiare nel file con il nome corretto con il timestamp aggiunto subito?
alex

Risposte:


21

Di solito lo faresti programmaticamente nel momento in cui crei o sposti il ​​file, ma è possibile attivare uno script ogni volta che un file viene creato o spostato in una cartella usando incron. Imposta il tuo file tab usando incrontab -euna linea come questa, ma ovviamente con i tuoi percorsi:

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

Quindi, /path/to/scriptscrivi un'azione di rinomina rapida. Tieni presente che lo script verrà chiamato anche per il nuovo file che crei, quindi deve verificare se il file è già stato opportunamente denominato o meno. In questo esempio verifica se il file ha un numero di dieci cifre per i secondi dall'epoca come ultima parte del nome del file e, in caso contrario, lo aggiunge:

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

Modifica: quando l'ho scritto per la prima volta, ho avuto poco tempo e non sono riuscito a capire come realizzare bashil pattern matching qui. Gilles ha sottolineato come farlo senza invocare grep usando la corrispondenza ERE in bash:

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

5

Penso che inotifysia lo strumento che potrebbe essere utilizzato in questo caso. In Debian c'è uno strumento inoticomingper eseguire azioni sulla creazione di file:

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

{} verrà sostituito con il nome file.

Il comando che ho fornito non è completo: causa un ciclo perché quando il file verrà rinominato verrà riconosciuto come nuovo, quindi verrà nuovamente mveditato e così via. Per evitare ciò, è possibile utilizzare l' --suffixopzione se si conosce quale suffisso sarà presente nel file prima di rinominarlo.


Nessun problema. Non ne ho mai sentito parlare inoticoming. Per curiosità, quando sarebbe meglio usarlo inocron?
Caleb,

Non so se sia meglio. Ne ho sentito parlare qualche tempo fa, ma non l'ho mai provato ... Ora ho trovato un'opinione inoticoming"simile incrond, ma più leggera e non avviata come demone predefinito", quindi penso che sia solo un'altra soluzione con un approccio leggermente diverso. .. Penso che incronsia più popolare - ho pochi problemi a trovare la inoticoming home page un pacchetto per questo fuori da Debian ...
pbm

Penso che tu abbia appena pubblicato il link sbagliato. La mia distribuzione non sembra averla da nessuna parte.
Caleb,

Ho trovato inoticomingsolo nelle distribuzioni basate su Debian (nel mio Gentoo non c'è ebuild per questo). Nella pagina che ho pubblicato ci sono due pacchetti: repreproe sotto di esso inoticoming...
pbm

2

Potresti semplicemente prendere uno script come questo e farlo funzionare ... Lascio che sia un esercizio per il lettore aggiungere i bit extra per avviarlo come servizio e impedire che vengano eseguite più copie contemporaneamente.

#!/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);
}

Ed eccolo qui:

$ 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

Ovviamente perl può fare qualsiasi cosa, ma uno script persistente che gira su un ciclo while-true di X secondi è sicuramente un hack quando puoi ricevere notifiche di eventi sulla scrittura di file e rispondere istantaneamente senza sprecare risorse per il resto del tempo.
Caleb,

@Caleb - Molto vero. Dando solo possibilità. Naturalmente, se lo stai facendo tramite notifica di sistema, hai la possibilità di ottenere due file creati con lo stesso nome entro lo stesso secondo, quindi gli script allegati dovrebbero gestire tali circostanze.
unpythonic il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.