파일 변경을 모니터링하고 명령을 실행하는 Bash 스크립트


12

하위 폴더가 많은 폴더가 asciidoctor있는데이 폴더는 .adoc확장명으로 포맷되어 있습니다.

파일을 변경할 때마다 (보통) 실행해야합니다

asciidoctor -q filename.adoc

HTML 형식으로 컴파일하십시오.

프로세스를 자동화하려고합니다. 지금까지 entr을 사용 하여이 작업을 수행했습니다 .

ls *.adoc | entr asciidoctor -q *.adoc

하위 폴더가 아닌 기존 폴더에서만 작동합니다. 이 변형을 시도했지만 작동하지 않습니다.

find . -name '*.adoc' | entr asciidoctor -q *.adoc

모든 하위 폴더에 대해이 자동화 프로세스를 구현하는 방법에 대한 아이디어가 있습니까?


답변:


17

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
  • -qinotifywait자체 정보가없는 자동 모드 사용

  • -m 모니터 모드를 활성화합니다. 그렇지 않으면 첫 번째 이벤트 후에 종료됩니다

  • --event modify, modify파일 수정시 에만 관심 이 있습니다. 다른 가능한 값은 open, close등등

  • --format %w파일 이름을 다른 명령의 입력으로 사용하므로 다른 정보가 아닌 수정 된 파일 이름 만 원합니다.

  • /foo/bar/*.adoc디렉토리 .adoc아래의 모든 파일 로 확장됩니다/foo/bar


위의 내용은 수정 될 때마다 파일 이름을 보여줍니다. 이제 파일 이름에서 명령을 실행합니다 (명령이 STDIN을 통해 인수를받는다고 가정).

inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc | asciidoctor -q

디렉토리에서 재귀 감시를 설정할 수도 있습니다. 그런 다음 grep원하는 파일 만 필터링하는 데 사용해야 합니다. -r디렉토리 에서 시계를 재귀 적으로 설정하고 ( ) 파일 만 필터링 /foo/bar하는 grep데 사용 .adoc합니다.

inotifywait -qrm --event modify --format '%w%f' /foo/bar | grep '\.adoc$' | asciidoctor -q

디렉토리를 볼 때 출력 형식 지정자가 %w디렉토리 이름으로 해석되므로 %f파일 이름을 가져와야합니다. 파일을 보면서 %f빈 문자열로 확인합니다.

inotifywait데몬 ( -d) 모드 에서 실행할 수도 있고, 전체를 스크립팅하거나 백그라운드에서 실행할 수도 있고, 더 많은 다른 옵션을 사용할 수도 있습니다.

또한 asciidoctor원하는 경우 원하는 다른 명령으로 바꿀 수 있습니다 .

man inotifywait더 많은 아이디어를 얻으려면 확인하십시오 .


고맙습니다. OSX와 비슷한 것도 있습니다. 그러나 나는 이것이 올바른 장소가 아니라고 생각합니다.
bran

@bran 예, IMHO는 UL 로 이동 하면 참조로 사용할 수 있습니다.
heemayl

큰 대답, 사소한 수정. -q는 프로그램을 "자세한 설명"으로 만들고, -qq (이중 q)는 치명적인 오류를 제외하고 완전히 자동으로 만듭니다.
jotadepicas

4

사용하는 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

여러 파일 또는 디렉토리를 재귀 적으로 모니터링하는 옵션과 파일 / 경로를 무시하는 옵션이 있습니다.


inotify-hookable이 명령을 실행 한 후에 종료되지 않습니다. 흠
최대

inotify-hookable은 다른 패키지에서 설치됩니다 :sudo apt-get install inotify-hookable
Bruno Silvano

3

특히 저장소를 검색하면 많은 도구가 있습니다.

apt-cache search monitor | grep file

많은 도구를 제공합니다. 그러나 내가 그렇게했기 때문에 테스트 할 필요는 없습니다.

이 도구와 다른 많은 도구를 테스트했습니다.

  • inotify
  • fswatch
  • 파일 감시
  • 견본
  • 변경된 파일
  • 입구

이 도구들 중 세 가지 도구가 유용하고 신뢰할 수 있음을 알았습니다.

  • direvent | C로 작성된 GNU
  • iwatch | 펄에서
  • fsniper

그리고이 세 가지 사이에서, 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루프 나 다른 물건 을 사용할 필요가 없습니다 .


풍모

  • 재귀 적으로 디렉토리를보고
  • 포 그라운드 또는 백그라운드 에서 데몬 으로 실행할 수 있습니다
  • 가지고 다닐 수 있는. CentOS7 서버뿐만 아니라 우분투에도 있습니다
  • 파일 이름 보고서
  • 파일 일치를 지원하는 정규식
  • 다중 파일 감시 (한 가지 유형의 파일보다 더 많은 것을보십시오)
  • 명령 실행 동기화 (멀티 워 처가있는 경우)
  • syslog 처리 (원하는 경우 syslog에 기록)
  • 쉽고 좋은 CLI 및 구성 파일 디자인

Sergey Poznyakoff에 의해 개발되었습니다 .


설치

sudo apt install direvent

그러나 소스 코드를 사용하여 설치하는 것은 매우 쉽고 간단하여 마지막 버전을 제공합니다 (현재는 5.1입니다).


-3

글쎄, 나는 다음을 추천한다.

#!/bin/bash
#Script
for SRC in *.adoc; 
      do
      asciidoctor -q $SRC
  done

1
OP는 수정이있을 때만 명령을 실행하려고합니다.
heemayl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.