Belirli bir dizine yerleştirildiklerinde dosyaları otomatik olarak yeniden adlandırma


14

Bir dosyayı belirli bir dizine yerleştirildiğinde otomatik olarak yeniden adlandırmak mümkün mü?

Örneğin, "dir0" adlı bir dizinim var. "File1" adlı bir dosyayı "dir0" klasörüne taşır veya kopyalarım. Daha sonra "file1", "file1_ {current timestamp}" olarak yeniden adlandırılmalıdır.


1
İnotify'a bir göz atın ( linux.die.net/man/7/inotify ). Ancak, zaman damgası eklenmiş olarak doğru şekilde adlandırılmış dosyaya hemen kopyalayamaz mısınız?
alex

Yanıtlar:


21

Genellikle bunu, dosyayı oluşturduğunuzda veya taşıdığınızda programlı olarak yaparsınız, ancak bir dosya oluşturulduğunda veya kullanılarak bir klasöre taşındığında bir komut dosyasını tetiklemek mümkündür incron. Sekme dosyanızı incrontab -eböyle bir satırla, ancak elbette yollarınızla ayarlayın:

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

Sonra /path/to/scripthızlı bir yeniden adlandırma eylemi yazın. Komut dosyasının, oluşturduğunuz yeni dosya için de çağrılacağını unutmayın; bu nedenle, dosyanın zaten uygun şekilde adlandırılıp adlandırılmadığını sınamalıdır. Bu örnekte, dosyanın dosya adının son kısmı olarak çağdan itibaren on basamaklı bir sayı olup olmadığını kontrol eder ve yoksa ekler:

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

Düzenleme: Ben bunu ilk yazdığımda zamanında kısaydı ve bashburada desen eşleştirme yapmak nasıl anlayamadık . Gilles bash'da ERE eşleşmesini kullanarak grep'i çağırmadan bunu nasıl yapacağına dikkat çekti :

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

5

inotifyBu durumda kullanılabilecek bir araç olduğunu düşünüyorum . Debian'da inoticomingdosya oluşturma işlemi gerçekleştirmek için bir araç vardır :

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

{} dosya adı ile değiştirilecektir.

Sağladığım komut tam değil - bir döngüye neden oluyor çünkü dosya yeniden adlandırılacağı zaman yeni olarak tanınacak, böylece mvAGAIN ed ve benzeri olacak. Bundan kaçınmak --suffixiçin, yeniden adlandırmadan önce dosyada hangi son ekin olacağını biliyorsanız seçeneği kullanabilirsiniz .


Sorun değil. Hiç duymadım inoticoming. Meraktan, bunu ne zaman kullanmak daha iyi olurdu inocron?
Caleb

Daha iyi olup olmadığını bilmiyorum. Bir süre önce duydum, ama hiç denemedim ... Şimdi inoticoming"benzer incrond, ancak daha hafif ve varsayılan bir daemon olarak başlatılmayan " bir fikir buldum , bu yüzden çok farklı bir yaklaşımla sadece başka bir çözüm olduğunu düşünüyorum. .. ben düşünüyorum incronben bulmak biraz sorun var - daha popüler inoticoming ana sayfa ... Debian dışında bunun için bir paket
PBM

Sanırım yanlış bağlantıyı yeni yayınladınız. Dağıtımımın hiçbir yerde olmadığı anlaşılıyor.
Caleb

inoticomingSadece Debian tabanlı dağıtımlarda buldum (Gentoo'mda bunun için ebuild yok). Gönderdiğim sayfada iki paket var: repreprove altında inoticoming...
pbm

2

Böyle bir senaryoyu alıp çalıştırabilirsiniz ... Okuyucunun bir hizmet olarak başlaması ve aynı anda birden fazla kopyanın çalışmasını önlemek için ekstra bitler eklemesi için bir alıştırma olarak bırakacağım.

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

Ve işte çalışıyor:

$ 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

Tabii ki herhangi bir şey perl yapabilir , ancak X-second while-true döngüsünde çalışan kalıcı bir komut dosyası, dosya yazma işlemleri hakkında olay bildirimleri alabileceğiniz ve zamanın geri kalanını boşa harcamadan anında yanıt verebildiğinizde kesinlikle bir hack'tir.
Caleb

@Caleb - Çok doğru. Sadece olasılıklar veriyorum. Tabii ki, sistem bildirimi ile yapıyorsanız, aynı saniye içinde aynı ada sahip iki dosya oluşturma olasılığınız vardır, bu nedenle ekli komut dosyaları bu koşulları ele almalıdır.
unpythonic
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.