Automatycznie zmieniaj nazwy plików, gdy są one umieszczone w określonym katalogu

14

Czy można automatycznie zmienić nazwę pliku, gdy jest on umieszczony w określonym katalogu?

Na przykład mam katalog o nazwie „katalog 0”. Przenoszę lub kopiuję plik o nazwie „plik 1” do „katalog 0”. Następnie „plik 1” powinien zmienić nazwę na „plik1_ {aktualny znacznik czasu}”

Nick.h
źródło
1
Spójrz na inotify ( linux.die.net/man/7/inotify ). Ale czy nie możesz od razu skopiować do poprawnie nazwanego pliku z dodanym znacznikiem czasu?
alex

Odpowiedzi:

21

Zwykle robisz to programowo podczas tworzenia lub przenoszenia pliku, ale możliwe jest uruchomienie skryptu za każdym razem, gdy plik zostanie utworzony lub przeniesiony do folderu za pomocą incron. Skonfiguruj plik tab za incrontab -epomocą takiej linii, ale oczywiście ze swoimi ścieżkami:

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

Następnie /path/to/scriptnapisz szybką akcję zmiany nazwy. Pamiętaj, że skrypt zostanie również wywołany dla nowego pliku, który utworzysz, więc musi sprawdzić, czy plik został już odpowiednio nazwany, czy nie. W tym przykładzie sprawdza, czy plik ma dziesięciocyfrową liczbę sekund z epoki jako ostatnią część nazwy pliku, a jeśli nie, dodaje go:

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

Edycja: Kiedy pierwszy raz to napisałem, miałem mało czasu i nie mogłem wymyślić, jak bashzrobić dopasowanie wzoru tutaj. Gilles wskazał, jak to zrobić bez wywoływania grep za pomocą dopasowania ERE w bash:

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

Myślę, inotifyże w tym przypadku można użyć tego narzędzia. W Debianie znajduje się narzędzie inoticomingdo wykonywania akcji związanych z tworzeniem plików:

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

{} zostanie zastąpiony nazwą pliku.

Podane przeze mnie polecenie nie jest kompletne - powoduje pętlę, ponieważ gdy nazwa pliku zostanie zmieniona, zostanie rozpoznana jako nowa, więc zostanie ponownie mvPONOWNIE uruchomiona i tak dalej. Aby tego uniknąć, możesz użyć --suffixopcji, jeśli wiesz, jaki przyrostek będzie w pliku przed zmianą nazwy.

pbm
źródło
Nie ma problemu. Nigdy o tym nie słyszałem inoticoming. Z ciekawości, kiedy lepiej byłoby to wykorzystać inocron?
Caleb
Nie wiem czy to jest lepsze. Słyszałem o tym jakiś czas temu, ale nigdy tego nie próbowałem ... Teraz znalazłem opinię, która inoticomingjest „podobna incrond, ale lżejsza i nie zaczyna się jako domyślny demon”, więc myślę, że to tylko inne rozwiązanie z nieco innym podejściem. .. Myślę, że incronjest to bardziej popularne - nie mam problemu ze znalezieniem inoticoming strony głównej dla niego poza Debianem ...
pbm
Myślę, że właśnie opublikowałeś niewłaściwy link. Wydaje się, że moja dystrybucja nigdzie go nie ma.
Caleb
Znalazłem inoticomingtylko w dystrybucjach opartych na Debianie (w moim Gentoo nie ma dla niego ebuilda). Na stronie, którą opublikowałem, są dwa pakiety: repreproa poniżej inoticoming...
pbm
2

Możesz po prostu wziąć taki skrypt i uruchomić go ... Zostawię to jako ćwiczenie dla czytelnika, aby dodać dodatkowe bity, aby uruchomić go jako usługę i zapobiec uruchamianiu wielu kopii jednocześnie.

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

A oto jak działa:

$ 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
niepythonic
źródło
Oczywiście perl można zrobić wszystko, ale trwały skrypt działający w pętli X-sekundowej podczas gdy prawda jest zdecydowanie włamaniem, gdy można otrzymywać powiadomienia o zdarzeniach dotyczące zapisywania plików i reagować natychmiast, bez marnowania zasobów przez resztę czasu.
Caleb
@Caleb - Very true. Po prostu dawanie możliwości. Oczywiście, jeśli robisz to za pomocą powiadomienia systemowego, masz możliwość uzyskania dwóch plików o tej samej nazwie w tej samej sekundzie, więc dołączone skrypty powinny poradzić sobie z tymi okolicznościami.
niepythonic