특정 디렉토리에 파일이 배치되면 자동으로 파일 이름을 바꿀 수 있습니까?
예를 들어 "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
이런 상황에서 사용할 수 있는 도구인 것 같아요 . 데비안에는 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