inotifywait를 사용하여 특정 확장자의 파일 작성을위한 디렉토리를 감시하는 방법


21

나는 이 대답 을 보았다 .

예를 들어, inotifywait 사용을 고려해야합니다.

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        # do something with the file
    done

내 질문은 위의 스크립트는 모든 유형의 파일 생성을위한 디렉토리를 감시하지만 inotifywait특정 유형 / 확장자의 파일이 생성되거나 디렉토리로 이동할 때만보고 하도록 명령을 수정하는 방법입니다. .xml파일이 생성 되면보고 합니다.

내가 시도한 것 :

inotifywait --help명령 을 실행했으며 명령 행 옵션을 읽었습니다. 그것은이 --exclude <pattern>--excludei <pattern>명령 배제 (정규식을 사용하여) 특정 유형의 파일을,하지만 난 방법이 필요 단지 INCLUDE 특정 유형 / 확장자의 파일을.


BTW, path위의 것을 사용 하는 것이 쉘에서 처음으로 이것을 사용 하려면 가장 좋은 변수 이름이 아닐 것입니다. 사용하면 기본적으로 표준을 재정의했기 때문에 명령과 모든 것을 사용할 수 없습니다 PATH. 따라서 fpath대신 다른 var 이름을 사용하는 것이 좋습니다 . 즉, while read fpath action file일반적으로 쉘에서 사용할 수있는 모든 표준 명령은 여전히 ​​유효합니다.
Baptiste Mathus

포함 옵션이 없다는 것은 말도 안됩니다.
Erandros

답변:


17

특정 유형 / 확장 파일이 생성 된 경우에만보고하도록 inotifywait 명령을 수정하는 방법

제발 참고이인지 검증되지 않은 코드 나에 액세스 할 수 없기 때문에 inotify지금은. 그러나 이것과 비슷한 것이 작동해야합니다.

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        if [[ "$file" =~ .*xml$ ]]; then # Does the file end with .xml?
            echo "xml file" # If so, do your thing here!
        fi
    done

2
이것은 작동하며 inotifywait로 테스트했습니다.
TheBetterJORT

1
이것을 어떻게 운영합니까? 일회성 명령입니까, 아니면 루프 또는 이와 유사한 것으로 실행해야합니까? 아마도 incron(나는하지 않기를 바랍니다)의 일환으로 .
SDsolar

@SDsolar 다릅니다. 나를 위해, 나는 보통 실행 inotify에 하나 nohup또는 사용자 정의 systemd 서비스를 시작합니다. 대부분 후자입니다.
maulinglawns

9

이중 부정을 사용하십시오.

inotifywait -m --exclude "[^j][^s]$" /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
    done

여기에는 자바 스크립트 파일 만 포함됩니다


1
좋아, 나는 그것이 inotifywait모든 파일에 대해 큰 출력을 생성하고 나중에 다른 응답과 같이 필터링 하지 않고 필터링을 이동시키는 것을 좋아합니다 . 시도하지는 않았지만 조금 더 빠를 것 같습니다.
TMG

이것은 내가 찾던 것입니다. 파일 --exclude을 감시 하도록 입력 을 수정하는 방법 .ext이것은 한 번만 또는 for 루프에서 실행됩니까?
kurokirasama

데몬이므로 충돌이 발생하거나 종료 될 때까지 실행됩니다. :)
Jonas Earendel

죄송합니다. 첫 번째 질문을 놓쳤습니다. inotifywait -m --exclude "[^.][^e][^x][^t]$" /home/jonas/Skrivbord/test -e create -e moved_to | while read path action file; do echo "The file '$file' appeared in directory '$path' via '$action'" done 나는 정규 표현식을 최적화 할 수 있다고 확신하지만이 아기는 효과가 있습니다 :)
Jonas Earendel

고맙습니다! 시험해 볼게요 !!
kurokirasama

3

이전 답변 의 이중 부정 접근 방식은 (TMG가 지적했듯이) 실제로 필터링 작업을으로 변경하기 때문에 좋은 생각 inotifywait이지만 올바른 것은 아닙니다.

에 파일 끝 예를 들어, as다음이 일치하지 않습니다 [^j][^s]$마지막 문자가 있기 때문에 s일치하지 않는 [^s], 따라서는 제외되지 않습니다.

부울 용어에서 if S는 다음과 같습니다.

"마지막 편지는 s"

그리고 J진술입니다 :

"두 번째 문자는 j"

다음의 값 --exclude매개 변수는 의미를 동일시해야 not(J and S)의한하는 데 모건의 법칙 이다 not(J) or not(S).

또 다른 잠재적 인 문제는 in zsh$path해당하는 배열을 나타내는 내장 변수 $PATH이므로 while read path ...행이 완전히 엉망 $PATH이되어 셸에서 모든 것이 실행 불가능하게됩니다.

따라서 올바른 접근 방식은 다음과 같습니다.

inotifywait -m --exclude "[^j].$|[^s]$" /path -e create -e moved_to |
    while read dir action file; do
        echo "The file '$file' appeared in directory '$dir' via '$action'"
    done

일치가 두 번째 위치에 적용되고 POSIX 확장 정규식을 취하기 때문에 위에서 언급 한 부울 OR을 나타내는 문자가 이스케이프되어서는 안된다는 것을 확인한 .후에 필요한 사항을 참고 하십시오 .[^j]|--exclude

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.