
여러 개의 하위 폴더가 포함된 폴더가 있는데 이러한 폴더는 확장자 asciidoctor
로 파일 형식이 지정 되었습니다 .adoc
.
파일을 변경할 때마다(종종) 다음을 실행해야 합니다.
asciidoctor -q filename.adoc
HTML 형식으로 컴파일합니다.
프로세스를 자동화하려고 합니다. 지금까지 나는 이것을 사용하여 왔습니다입장:
ls *.adoc | entr asciidoctor -q *.adoc
하위 폴더가 아닌 기존 폴더에서만 작동합니다. 이 변형을 시도했지만 작동하지 않습니다.
find . -name '*.adoc' | entr asciidoctor -q *.adoc
모든 하위 폴더에 대해 이 자동화 프로세스를 구현하는 방법에 대한 아이디어가 있습니까?
답변1
Linux는 파일 생성, 수정, 제거와 같은 모든 파일 시스템 이벤트를 모니터링하기 위한 멋진 인터페이스를 제공합니다. 인터페이스는 inotify
시스템 호출 계열이며, 이러한 호출을 활용하는 사용자 공간 유틸리티는 inotify-tools
Ubuntu의 패키지에서 제공됩니다(유니버스 저장소에서 사용 가능). 아직 설치하지 않은 경우 다음 방법으로 설치하세요.
sudo apt-get install inotify-tools
inotify-tools
제공 inotifywait
하고 inotifywatch
바이너리를 제공하려면 첫 번째 것이 필요합니다.
따라서 파일이 수정 asciidoctor -q some_file
되면 ( 이로 대체됨) 명령을 실행하려고 합니다. 파일이 디렉토리에 있다고 가정하면 감시를 설정할 수 있습니다..adoc
some_file
.adoc
/foo/bar
inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc
-q
자동 모드를 활성화하며inotifywait
자체 정보는 없습니다.-m
모니터 모드를 활성화합니다. 그렇지 않으면 첫 번째 이벤트 후에 종료됩니다.--event modify
modify
, 우리는 파일이 수정되는 이벤트에만 관심이 있습니다 . 다른 가능한 값으로는 등이 있습니다open
.close
--format %w
, 파일 이름을 다른 명령에 대한 입력으로 사용하므로 다른 정보가 아닌 수정된 파일 이름만 원합니다./foo/bar/*.adoc
디렉토리.adoc
아래의 모든 파일 로 확장됩니다./foo/bar
이제 위의 내용은 수정될 때마다 파일 이름을 표시합니다. 이제 파일 이름에 대해 명령을 실행합니다(명령이 STDIN을 통해 인수를 취한다고 가정).
inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc | while read -r file ; do
asciidoctor -q "$file"
done
grep
디렉터리에 재귀 감시를 설정할 수도 있으며, 그런 다음 원하는 파일만 필터링하는 데 사용해야 합니다 . 여기서는 -r
디렉토리에 시계를 재귀적으로( ) 설정 /foo/bar
하고 파일 grep
만 필터링하는 데 사용합니다..adoc
inotifywait -qrm --event modify --format '%w%f' /foo/bar | grep '\.adoc$' | while read -r file ; do
asciidoctor -q "$file"
done
디렉터리를 관찰할 때 출력 형식 지정자는 %w
디렉터리 이름으로 확인되므로 %f
파일 이름을 가져와야 합니다. 파일을 보는 동안 %f
빈 문자열로 확인됩니다.
inotifywait
데몬( ) 모드에서 실행할 수도 있고 -d
, 전체를 스크립팅할 수도 있으며, 백그라운드에서 실행하거나 더 많은 다른 옵션을 사용할 수도 있습니다.
asciidoctor
또한 원하는 경우 원하는 다른 명령으로 바꿀 수도 있습니다 .
man inotifywait
더 많은 아이디어를 얻으려면 확인하세요 .
답변2
특히 저장소를 검색하는 경우 많은 도구가 있습니다.
apt-cache search monitor | grep file
이는 우리에게 많은 도구를 제공합니다. 하지만 내가 그렇게 했기 때문에 여러분은 그것들을 테스트할 필요가 없습니다.
inotifywait
나는 이러한 도구와 다른 많은 도구를 테스트했습니다.inotify-tools
),fswatch
, filewatch
,swatch
,
fileschanged
, 그리고entr
.
이 도구 중에서 유용하고 신뢰할 수 있는 세 가지 도구를 찾았습니다.
그리고 이 세 가지 중에서direvent
두말할 것 없이 최고입니다.
direvent
너무 유용하고 믿음직해서 간단하게 사용해봤습니다.관로내가 가지고 있는 마이크로서비스로.
direvent.conf
시청용 파일
syslog {
facility local0;
tag "direvent";
print-priority yes;
}
watcher {
path /var/www/html/ir/jsfun/build/react recursive;
file "*.js";
event write;
command "/usr/bin/xdotool search --onlyvisible --class firefox key F5";
option (stdout, stderr, wait);
}
이것은 변경 사항이 있을 때마다 내가 가지고 있는 구성 파일 중 하나일 뿐입니다.쓰다그런 다음 이 명령이 실행됩니다.세게 때리다스크립트도 그렇고.
while
루프나 다른 것을 사용할 필요가 없습니다 .
특징
- 재귀적으로 디렉토리를 관찰하기
- 에서 실행할 수 있습니다전경또는배경데몬으로서
- 가지고 다닐 수 있는. Ubuntu와 CentOS7 서버에 있습니다.
- 파일 이름 보고서
- 파일 일치를 지원하는 정규식
- 다중 파일 보기(한 가지 유형의 파일 이상 보기)
- 명령 실행 동기화(다중 감시자가 있는 경우)
- syslog 처리(원하는 경우 syslog에 기록)
- 쉽고 좋은 CLI 및 구성 파일 디자인
개발자:세르게이 포즈냐코프.
설치 중
sudo apt install direvent
그러나 소스 코드를 사용하여 설치하는 것은 매우 쉽고 간단하므로 최신 버전(현재는 5.1)이 제공됩니다.
답변3
를 사용하는 inotifywait
것이 일반적인 접근 방식이지만, inotify-hookable
파일(또는 디렉터리)이 변경될 때 명령을 실행할 수 있게 해주는 별도의 유틸리티도 있습니다.
inotify-hookable -f filename.adoc -c 'asciidoctor -q filename.adoc'
명령을 한 번 실행한 후 종료되는 것 같습니다. 연속 시청 옵션이 표시되지 않으므로 다음과 같이 할 수 있습니다.
while true; do
inotify-hookable -f filename.adoc -c 'asciidoctor -q filename.adoc'
echo "== $(date) : executed, continuing to monitor..."
done
여러 파일이나 디렉터리를 반복적으로 모니터링하는 옵션과 파일/경로를 무시하는 옵션이 있습니다.
답변4
글쎄요, 저는 다음을 추천합니다.
#!/bin/bash
#Script
for SRC in *.adoc;
do
asciidoctor -q $SRC
done