2011-09-24 2 views
19

"ineify-tools"를 사용하여 디렉토리를 모니터하고 "EE"가 포함 된 행을 제거하여 모든 새 파일을 변경하는 bash 스크립트를 작성하려고합니다. 변경되면 파일을 다른 디렉토리로 이동합니다.inotify 및 bash

#!/bin/sh 
    while inotifywait -e create /home/inventory/initcsv; do 
     sed '/^\"EE/d' Filein > fileout #how to capture File name? 
     mv fileout /home/inventory/csvstorage 
    fi 
    done 

도와주세요. 기본적으로

답변

18

inotifywait -e CREATE에서 텍스트 출력은 watched_filename/home/inventory/initcsvevent_filename을 나타냅니다

 watched_filename CREATE event_filename 

새 파일의 이름을 나타내는 형태입니다.

DIR=/home/inventory/initcsv 
    while RES=$(inotifywait -e create $DIR); do 
     F=${RES#?*CREATE } 

을하고 Filein 이름으로 당신의 sed 라인 사용 $F에서 :

그래서, 당신의 while inotifywait -e ... 라인 대신에 넣어. $(...) 구조는 posix 호환 형식의 프로세스 대체 형식 (종종 역 따옴표를 사용하여 완료)이며 결과는 가장 짧은 패턴 일치 접두사가 제거 된 $RES과 같습니다. 패턴의 마지막 문자는 공백입니다.

업데이트 1 sed의 라인을 사용하는 대신 $F"$F"에 공백을 포함 할 수 있습니다 파일 이름을 처리하기 위해 [2 업데이트보기]. 즉, F 값에 대한 참조를 큰 따옴표로 묶으십시오.

RES=...F=... 정의에는 큰 따옴표를 사용할 필요가 없지만 원하는 경우 사용할 수 있습니다. 예 : F=${RES#?*CREATE }F="${RES#?*CREATE }" 둘 다 공백이 포함 된 파일 이름을 처리 할 때 정상적으로 작동합니다.

업데이트 2 Daan의 설명에서 언급했듯이 inotifywait에는 출력 형식을 제어하는 ​​--format 매개 변수가 있습니다.

Setting up watches. 
Watches established. 
RES is a at Tue Dec 31 11:37:20 MST 2013 
Setting up watches. 
Watches established. 
RES is aaa at Tue Dec 31 11:37:21 MST 2013 
Setting up watches. 
Watches established. 
RES is aaaa at Tue Dec 31 11:37:22 MST 2013 
Setting up watches. 
Watches established. 
+0

'--format % w' 옵션을 사용하여 출력하지 않으면 파일 이름 만 사용할 수 있습니다. – Daan

+0

@ Daan, 맞습니다. (% f, % w 제외). 업데이트 2를 참조하십시오 –

+0

'inotifywait -e delete_self aSymlinkFilename' 심볼릭 링크가 삭제 된 경우에만 실제 파일이 삭제 될 때 작동하지 않습니다. (깨진 심볼릭 링크에서는 작동하지 않습니다 : ( –

1

inotifywait를의 매뉴얼 페이지를 인용 : 명령으로

while RES=$(inotifywait -e create $DIR --format %f .) 
    do echo RES is $RES at `date`; done 

다른 단말기에서 실행되는 하나 개의 단자와 명령

touch a aa; sleep 1; touch aaa;sleep 1; touch aaaa 

에서 실행, 다음과 같은 출력은 제 1 터미널에 출연 :

inotifywait will output diagnostic information on standard error and event information on 
    standard output. The event output can be configured, but by default it consists of lines 
    of the following form: 

    watched_filename EVENT_NAMES event_filename 

    watched_filename 
      is the name of the file on which the event occurred. If the file is a directory, a 
      trailing slash is output. 

즉, 파일의 이름을 표준 출력에 인쇄합니다. 따라서 표준 출력에서 ​​읽은 다음 원하는 작업을 수행해야합니다.

8

inotifywait의 출력의 형식은 : 파일 이름에 공백이 쉼표를 포함 할 수 있습니다

filename eventlist [eventfilename] 

경우,이 구문 분석 할 수 까다로운 가져옵니다.만약 'sane'파일 이름 만 있으면 다음과 같이 할 수 있습니다 :

+1

+1 -m 스위치 사용). 변경 사항을 모니터링하지 않으면 스크립트는 이전 파일이 처리되는 동안 업로드 된 파일을 처리하지 않습니다. – frnknstn

+0

이것은 정말 좋은 솔루션입니다. 감사합니다! – sleepycal