나는 보았다이 답변:
예를 들어 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
적어도 바이너리의 기본 버전에서는 실제 옵션입니다 .
답변3
이중 부정 방식이지만이전 답변(TMG가 지적했듯이) 필터링 작업을 로 전환하기 때문에 좋은 생각이지만 inotifywait
이는 잘못된 것입니다.
예를 들어 파일이 as
then 으로 끝나는 경우 [^j][^s]$
마지막 문자가 s
일치하지 않으므로 일치하지 않으므로 [^s]
제외되지 않습니다.
부울 용어로 if는 S
다음과 같은 명령문입니다.
"마지막 편지는
s
"
그리고 J
다음과 같은 진술이 있습니다.
"두 번째 문자는
j
"
그러면 매개변수의 값은 --exclude
의미상 와 같아야 합니다 not(J and S)
. 즉,드모건의 법칙예 not(J) or not(S)
.
또 다른 잠재적인 문제는 zsh
in이 $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
여기에는 자바스크립트 파일만 포함됩니다.