特定のディレクトリに配置されたファイルを自動的に名前変更する


14

特定のディレクトリに配置されたファイルを自動的に名前変更することは可能ですか?

たとえば、「dir0」という名前のディレクトリがあります。「file1」という名前のファイルを「dir0」に移動またはコピーします。「file1」は「file1_ {current timestamp}」に名前を変更する必要があります


1
inotify(linux.die.net/man/7/inotify)をご覧ください。しかし、タイムスタンプを追加した適切な名前のファイルにすぐにコピーすることはできませんか?
アレックス

回答:


21

通常、ファイルを作成または移動するときにプログラムでこれを行いますが、を使用してファイルが作成またはフォルダーに移動されるたびにスクリプトをトリガーすることができます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ので、ここでパターンマッチングを行う方法を理解できませんでした。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。これを回避するため--suffixに、名前を変更する前にファイル内のサフィックスがわかっている場合は、オプションを使用できます。


問題ない。私は聞いたことがないinoticoming。好奇心のうち、ときにオーバーこれを使用する方がよいでしょうかinocron
カレブ

それが良いかどうかはわかりません。少し前にそれについて聞いたことがありますが、試したことはありません...今でinoticomingは、「に似てincrondいますが、より軽量で、デフォルトのデーモンとして開始されない」という意見を見つけました。 .. incronもっと人気があると思うinoticoming
-Debian

間違ったリンクを投稿したと思います。私のディストリビューションはどこにも持っていないようです。
カレブ

inoticomingDebianベースのディストリビューションでしか見つかりませんでした(私のGentooにはebuildがありません)。:ページで私は2つのパッケージがあることを掲示repreproし、その下にinoticoming...
PBM

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秒while-trueループで実行される永続的なスクリプトは、ファイル書き込みに関するイベント通知を取得し、残りの時間をリソースを無駄にすることなく即座に応答できる場合、間違いなくハックです。
カレブ

@カレブ-非常に本当。可能性を与えるだけです。もちろん、システム通知を介してそれを行っている場合、同じ名前で同じ秒で2つのファイルを作成する可能性があるため、添付のスクリプトでこれらの状況を処理する必要があります。
-unpythonic
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.