특정 디렉토리에 파일을 배치하면 자동으로 파일 이름 바꾸기

특정 디렉토리에 파일을 배치하면 자동으로 파일 이름 바꾸기

특정 디렉토리에 파일이 배치되면 자동으로 파일 이름을 바꿀 수 있습니까?

예를 들어 "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

관련 정보