特定のディレクトリにファイルを配置すると、自動的にファイル名を変更できますか?
たとえば、「dir0」というディレクトリがあります。 「file1」というファイルを「dir0」に移動またはコピーします。その後、「file1」の名前を「file1_{現在のタイムスタンプ}」に変更する必要があります。
答え1
通常、ファイルを作成または移動するときにプログラムでこれを実行しますが、ファイルを作成またはフォルダに移動するたびにスクリプトをトリガーすることができますincron
。次incrontab -e
の行とパスを使用してタブファイルを設定します。
/path/to/dir0 IN_MOVED_TO,IN_CREATE /path/to/script $@/$#
次に、/path/to/script
クイック名前変更操作を作成します。このスクリプトは作成した新しいファイルに対しても呼び出されるため、ファイル名が正しいことをテストする必要があります。この例では、ファイル名の最後の部分として、エポック以降の10桁の数がファイル名に含まれていることを確認し、そうでない場合はそれを追加します。
#!/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