Answers:
通常,您会在创建或移动文件时以编程方式执行此操作,但是只要使用创建文件或将其移动到文件夹,就可以触发脚本incron
。使用这样incrontab -e
的行来设置标签文件,但是当然要使用路径:
/path/to/dir0 IN_MOVED_TO,IN_CREATE /path/to/script $@/$#
然后/path/to/script
编写一个快速重命名操作。请注意,该脚本还会为您创建的新文件调用,因此它必须测试该文件是否已被正确命名。在此示例中,它检查文件是否从文件名开始算起从十进制开始的秒数(十秒),如果没有,则将其添加:
#!/bin/bash
echo $1 | grep -qx '.*_[0-9]\{10\}' || mv "$1" "$1_$(date +%s)"
编辑:当我第一次写这篇文章时,我时间很紧,无法弄清楚如何在bash
这里进行模式匹配。Gilles指出了如何在不使用bash中的ERE匹配调用grep的情况下执行此操作:
#!/bin/bash
[[ ! ( $1 =~ _[0-9]{10}$ ) ]] && mv "$1" "$1_$(date +%s)"
我认为这inotify
是在这种情况下可以使用的工具。在Debian中,有inoticoming
用于执行文件创建操作的工具:
inoticoming --foreground /path/to/directory mv {} {}-"`date`" \;
{}
将被替换为文件名。
我提供的命令不完整-导致循环,因为当文件被重命名时,它将被识别为新文件,因此将mv
再次被ed等。为了避免这种情况,--suffix
如果知道重命名之前文件中将包含什么后缀,则可以使用option。
inoticoming
。出于好奇,什么时候可以更好地使用它inocron
呢?
inoticoming
仅在基于Debian的发行版中找到(在我的Gentoo中,没有针对它的ebuild)。在我发布的页面上有两个软件包:reprepro
在它下面inoticoming
……
您可以只使用一个这样的脚本并运行它...我将把它作为练习,让读者添加一些额外的内容以使其作为服务启动,并防止同时运行多个副本。
#!/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);
}
它的工作原理是:
$ 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
perl
可以做任何事情,但是在X-second while-true循环上运行的持久脚本绝对是黑客,当您可以获得有关文件写入的事件通知并立即做出响应而又不浪费资源的时候。