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

나는 이 대답 을 보았다 .

예를 들어, 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 특정 유형 / 확장자의 파일을.



답변

특정 유형 / 확장 파일이 생성 된 경우에만보고하도록 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

답변

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

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

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


답변

이전 답변 의 이중 부정 접근 방식은 (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