답변:
일반적으로 파일을 만들거나 이동할 때 프로그래밍 방식으로이 작업을 수행하지만을 사용하여 파일을 만들거나 폴더로 이동할 때마다 스크립트를 트리거 할 수 있습니다 incron
. 다음 incrontab -e
과 같은 줄을 사용하여 물론 탭 경로를 설정하십시오.
/path/to/dir0 IN_MOVED_TO,IN_CREATE /path/to/script $@/$#
그런 다음 /path/to/script
빠른 이름 바꾸기 작업을 작성하십시오. 생성 한 새 파일에 대해 스크립트가 호출되므로 파일의 이름이 이미 지정되어 있는지 테스트해야합니다. 이 예제에서는 파일 이름의 마지막 부분으로 epoch에서 파일에 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)"
나는 inotify
이 경우에 사용되는 도구 라고 생각합니다 . 데비안에는 inoticoming
파일 생성시 작업을 실행하기위한 도구 가 있습니다.
inoticoming --foreground /path/to/directory mv {} {}-"`date`" \;
{}
파일 이름으로 바뀝니다.
내가 제공 한 명령이 완료되지 않았습니다. 파일 이름이 mv
바뀌면 새 파일로 인식되어 다시 인식되지 않기 때문에 루프가 발생합니다 . 이를 피하기 위해 --suffix
이름을 바꾸기 전에 파일에 어떤 접미사가 있는지 알고있는 경우 옵션을 사용할 수 있습니다 .
inoticoming
. 호기심에서 이것을 언제 사용하는 것이 더 inocron
좋을까요?
inoticoming
데비안 기반 배포판에서만 발견 했습니다 (내 젠투에는 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 초 동안 true 루프에서 실행되는 영구 스크립트는 파일 쓰기에 대한 이벤트 알림을 받고 나머지 시간 동안 리소스를 낭비하지 않고 즉시 응답 할 수있는 해킹입니다.