将文件放在特定目录中时自动重命名文件


14

将文件放在特定目录中时,是否可以自动重命名?

例如,我有一个名为“ dir0”的目录。我将一个名为“ file1”的文件移动或复制到“ dir0”。然后,“ file1”应重命名为“ file1_ {current timestamp}”


1
看一下inotify(linux.die.net/man/7/inotify)。但是您是否不能立即复制带有附加时间戳的正确命名的文件?
alex

Answers:


21

通常,您会在创建或移动文件时以编程方式执行此操作,但是只要使用创建文件或将其移动到文件夹,就可以触发脚本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)"

5

我认为这inotify是在这种情况下可以使用的工具。在Debian中,有inoticoming用于执行文件创建操作的工具:

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

{} 将被替换为文件名。

我提供的命令不完整-导致循环,因为当文件被重命名时,它将被识别为新文件,因此将mv再次被ed等。为了避免这种情况,--suffix如果知道重命名之前文件中将包含什么后缀,则可以使用option。


没问题。我从未听说过inoticoming。出于好奇,什么时候可以更好地使用它inocron呢?
卡莱布

我不知道这是否更好。我前一段时间听说过它,但是我从未尝试过……现在,我发现inoticoming“类似于incrond,但重量较轻,没有作为默认守护程序启动”的意见,因此,我认为这是另一种方法,但方法稍有不同。 ..我认为这incron是比较流行的-我有一点麻烦找到inoticoming 主页的Debian之外的包吧...
PBM

我认为您刚刚发布了错误的链接。我的发行版似乎什么地方都没有。
卡莱布

inoticoming仅在基于Debian的发行版中找到(在我的Gentoo中,没有针对它的ebuild)。在我发布的页面上有两个软件包:reprepro在它下面inoticoming……
pbm 2011年

2

您可以只使用一个这样的脚本并运行它...我将把它作为练习,让读者添加一些额外的内容以使其作为服务启动,并防止同时运行多个副本。

#!/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循环上运行的持久脚本绝对是黑客,当您可以获得有关文件写入的事件通知并立即做出响应而又不浪费资源的时候。
Caleb

@Caleb-非常正确。只是给可能性。当然,如果通过系统通知进行操作,则有可能在同一秒内获得两个具有相同名称的文件创建,因此附加的脚本应能处理这些情况。
2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.