파일이 특정 디렉토리에있을 때 파일 이름을 자동으로 바꿉니다.


14

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

예를 들어 "dir0"이라는 디렉토리가 있습니다. "file1"이라는 파일을 "dir0"으로 이동하거나 복사 한 다음 "file1"의 이름을 "file1_ {current timestamp}"로 변경해야합니다.


1
inotify ( linux.die.net/man/7/inotify )를 살펴보십시오 . 그러나 타임 스탬프가 추가 된 올바른 이름의 파일로 바로 복사 할 수 없습니까?
alex

답변:


21

일반적으로 파일을 만들거나 이동할 때 프로그래밍 방식으로이 작업을 수행하지만을 사용하여 파일을 만들거나 폴더로 이동할 때마다 스크립트를 트리거 할 수 있습니다 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)"

5

나는 inotify이 경우에 사용되는 도구 라고 생각합니다 . 데비안에는 inoticoming파일 생성시 작업을 실행하기위한 도구 가 있습니다.

 inoticoming --foreground /path/to/directory mv {} {}-"`date`" \;

{} 파일 이름으로 바뀝니다.

내가 제공 한 명령이 완료되지 않았습니다. 파일 이름이 mv바뀌면 새 파일로 인식되어 다시 인식되지 않기 때문에 루프가 발생합니다 . 이를 피하기 위해 --suffix이름을 바꾸기 전에 파일에 어떤 접미사가 있는지 알고있는 경우 옵션을 사용할 수 있습니다 .


문제 없어요. 나는 들어 본 적이 없다 inoticoming. 호기심에서 이것을 언제 사용하는 것이 더 inocron좋을까요?
Caleb

더 나은지 모르겠습니다. 나는 얼마 전에 그것에 대해 들었지만 결코 시도하지 않았다 ... 이제는 inoticoming"와 비슷 incrond하지만 더 가벼우 며 기본 데몬으로 시작되지 않았다 "는 견해를 발견 했으므로 아주 다른 접근법을 가진 또 다른 솔루션이라고 생각합니다. .. 그게 incron더 대중적 이라고 생각합니다. 데비안 이외의 패키지를 inoticoming 홈 페이지 에서 찾는 데 어려움이 거의 없습니다 ...
pbm

방금 잘못된 링크를 게시했다고 생각합니다. 내 배포판에는 어디에도없는 것 같습니다.
Caleb

inoticoming데비안 기반 배포판에서만 발견 했습니다 (내 젠투에는 ebuild가 없습니다). 내가 게시 한 페이지에는 두 가지 패키지가 있습니다. 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 초 동안 true 루프에서 실행되는 영구 스크립트는 파일 쓰기에 대한 이벤트 알림을 받고 나머지 시간 동안 리소스를 낭비하지 않고 즉시 응답 할 수있는 해킹입니다.
Caleb

@ Caleb-매우 사실입니다. 단지 가능성을 제공합니다. 물론 시스템 알림을 통해 수행하는 경우 동일한 초 안에 동일한 이름으로 두 개의 파일 작성을 얻을 수 있으므로 첨부 된 스크립트가 해당 상황을 처리해야합니다.
unpythonic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.