inotifywait를 사용하여 디렉터리에서 특정 확장자를 가진 파일 생성을 모니터링하는 방법

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>이 있습니다들어오지 못하게 하다특정 유형의 파일(정규식 사용)을 사용하지만 방법이 필요합니다.포함하다특정 유형/확장자의 파일만.

답변1

inotifywait특정 유형/확장자의 파일이 생성될 때만 보고하도록 명령을 수정하는 방법

이는테스트되지 않은 코드inotify지금은 접근할 수 없기 때문입니다. 그러나 이와 비슷한 것이 다음에서 작동합니다 bash.

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

아니면, 아니 bash,

inotifywait -m /path -e create -e moved_to |
    while read -r directory action file; do
        case "$file" in
            (*.xml)
                echo "xml file" # Do your thing here!
                ;;
        esac
        fi
    done

최신 버전에서는 inotifywait파일에 대해 직접 패턴 일치를 만들 수 있습니다.

inotifywait -m /path -e create -e moved_to --include '.*\.xml$' |
    while read -r directory action file; do
        echo "xml file" # Do your thing here!
    done

답변2

--include--includei적어도 바이너리의 기본 버전에서는 실제 옵션입니다 .

https://github.com/inotify-tools/inotify-tools/tree/master

답변3

이중 부정 방식이지만이전 답변(TMG가 지적했듯이) 필터링 작업을 로 전환하기 때문에 좋은 생각이지만 inotifywait이는 잘못된 것입니다.

예를 들어 파일이 asthen 으로 끝나는 경우 [^j][^s]$마지막 문자가 s일치하지 않으므로 일치하지 않으므로 [^s]제외되지 않습니다.

부울 용어로 if는 S다음과 같은 명령문입니다.

"마지막 편지는 s"

그리고 J다음과 같은 진술이 있습니다.

"두 번째 문자는 j"

그러면 매개변수의 값은 --exclude의미상 와 같아야 합니다 not(J and S). 즉,드모건의 법칙not(J) or not(S).

또 다른 잠재적인 문제는 zshin이 $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

.after는 [^j]일치 항목이 끝에서 두 번째 위치에 적용되는지 확인 해야 하며 POSIX 확장 정규 표현식이 사용되므로 |여기서 문자(위에서 언급한 부울 OR을 나타냄)를 이스케이프해서는 안 됩니다 .--exclude

그러나 참조하십시오투표하고@에리코틴의답변이는 최신 버전에 대한 inotifywait보다 깔끔한 접근 방식입니다 .

답변4

이중 부정문을 사용하세요:

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

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

관련 정보