当文件放置在特定目录中时,是否可以自动重命名文件?
例如,我有一个名为“dir0”的目录。我将名为“file1”的文件移动或复制到“dir0”。然后“file1”应重命名为“file1_{当前时间戳}”
答案1
通常,您会在创建或移动文件时以编程方式执行此操作,但每当使用 . 创建文件或将文件移动到文件夹时,都可以触发脚本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
在这里进行模式匹配。吉尔斯指出如何在不调用 grep 的情况下使用 bash 中的 ERE 匹配来执行此操作:
#!/bin/bash
[[ ! ( $1 =~ _[0-9]{10}$ ) ]] && mv "$1" "$1_$(date +%s)"
答案2
我认为这inotify
是在这种情况下可以使用的工具。在 Debian 中,有一个inoticoming
用于执行文件创建操作的工具:
inoticoming --foreground /path/to/directory mv {} {}-"`date`" \;
{}
将被替换为文件名。
我提供的命令不完整 - 它会导致循环,因为当文件被重命名时,它将被识别为新文件,因此它将再次被mv
编辑,依此类推。为了避免这种情况--suffix
,如果您在重命名之前知道文件中的后缀是什么,则可以使用选项。
答案3
您可以采用这样的脚本并运行它...我将把它作为练习留给读者添加额外的部分以使其作为服务启动并防止同时运行多个副本。
#!/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