새 파일의 폴더를 모니터링하는 스크립트? 폴더에서 새

스크립트 를 사용하여 폴더에서 새 파일을 감지하는 방법은 무엇입니까? 폴더에서 파일을 생성하자마자 처리하고 싶습니다. 이것이 가능합니까 아니면 매분마다 새로운 파일을 확인 하는 으로 스크립트를 예약 해야합니까?



답변

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로 제공됩니다 inotify-tools. 버전 3.13부터 (Ubuntu 12.04에서 현재) inotifywait는 -f 옵션없이 파일 이름을 포함합니다. 이전 버전은 강제해야 할 수도 있습니다. 주목 해야 할 것은 이벤트 필터링을 수행하는 가장 좋은 방법은 -e옵션 inotifywait입니다. 또한 read명령은 위치 출력을 여러 변수에 지정하여 사용하거나 무시하도록 선택할 수 있습니다. grep / sed / awk를 사용하여 출력을 사전 처리 할 필요가 없습니다.


답변

incron관리하기 쉽기 때문에 선호합니다 . 기본적으로 이는 서비스를 활용 inotify하며 파일 변경 작업을 기반으로 조치를 취하도록 구성을 설정할 수 있습니다.

전의:

<directory> <file change mask> <command or action>  options
/var/www/html IN_CREATE /root/scripts/backup.sh

여기에서 전체 예를 볼 수 있습니다 :
http://www.cyberciti.biz/faq/linux-inotify-examples-to-replicate-directories/


답변

방금 이것을 요리하고 검사 사이에 파일이 누락 될 가능성을 제외하고는 큰 문제가 없습니다.

while true
do
       touch  ./lastwatch
       sleep 10
       find /YOUR/WATCH/PATH -cnewer ./lastwatch -exec SOMECOMMAND {} \;
done

파일 처리에 시간이 오래 걸리지 않으면 새 파일을 놓치지 않아야합니다. 당신은 또한 활동을 배경으로 할 수 있습니다 … 그것은 방탄은 아니지만 inotify와 같은 외부 도구없이 일부 목적을 제공합니다.


답변

당신은 watch당신의 스크립트에서 사용할 수 있습니다

watch -n 0.1 ls <your_folder>

폴더를 모니터링하고 0.1 초마다 모든 것을 나열합니다

약점

실시간이 아니므로 파일이 0.1 초 이내에 생성 및 삭제 된 경우 작동하지 않으며 watch최소 0.1 초만 지원합니다.


답변

대상 폴더 ( isempty편의를 위해 전화 할 것입니다 )가 비어 있고 하나 이상의 파일이 드롭되기를 기다리고 있다고 가정합니다 .

다음 명령을 사용할 수 있습니다.

ls -1A isempty | wc -l

폴더가 여전히 비어 있는지 확인하기 위해 새 파일이 없으면 0을 반환 isempty하거나 폴더가 여전히 비어 있으면 0보다 큰 값을 반환합니다 (실제로는 숫자 폴더에있는 파일 수).

그것은 바보 같은 if / then 테스트가 나머지 작업을 수행 할 수 있다고 말했습니다.

if [ $(ls -1A isempty | wc -l) -gt 0 ] ; then do_something ; fi

물론 do_something함수는 isempty폴더 내에서 파일을 조작 한 다음 처리 후 폴더 자체에서 파일 을 제거해야합니다.

crontab에 다음과 같은 줄을 추가하면 1 분에 한 번씩 검사가 실행 do_something되고 폴더가 비어 있지 않은 경우 작업 이 트리거됩니다 .

* * * * *     if [ $(ls -1A isempty | wc -l) -gt 0 ] ; then do_something ; fi


답변

새 파일을 감지하려면 해당 파일을 처리하고 마지막에 진행된 파일을 삭제하면 systemd.path 를 사용할 수 있습니다 . 이 방법은 inotify를 기반으로합니다. DirectoryNotEmpty 옵션이 있으므로 systemd는 디렉토리의 파일을 감지 할 때 항상 스크립트를 실행할 수 있습니다. 진행된 파일을 삭제할 수 있고 스크립트가 디렉토리를 비워 둔 경우에만 작동한다는 것을 기억해야합니다.

먼저 mymonitor.service 파일을 준비하십시오.

[Unit]
Description=Start the script

[Service]
Type=oneshot
ExecStart=/path/to/your/script

다음으로 mymonitor.path로 이동하여 경로를 정의하십시오.

[Unit]
Description= Triggers the service

[Path]
DirectoryNotEmpty=/path/to/monitor

[Install]
WantedBy=multi-user.target

.path 파일 이름이 서비스 이름과 동일하면 .path 파일에 서비스 이름을 지정할 필요가 없습니다.

더미에 대한 파일 액세스 모니터링을 기반으로합니다.


답변

entr

사용하는 entr것이 새로운 방법입니다 (크로스 플랫폼). 참고 entr는 폴링을 사용하지 않으므로 많은 대안에 비해 큰 이점이 있습니다.

폴링을 사용 kqueue(2)하거나 inotify(7)피합니다. entr빠른 피드백과 자동 테스트를 자연스럽고 완전히 평범하게하도록 작성되었습니다.

BSD에서는 pledge(2)

당신은 그것을 설치할 수 있습니다

apt-get install entr
dnf install entr

다음을 사용하여 새로 추가 한 디렉토리를 추적 할 수 있습니다.

while $(true); do
  # echo ./my_watch_dir | entr -dnr echo "Running trigger..."
  echo ./my_watch_dir | entr -dnr ##MY COMMAND##
done;

옵션은 (문서에서),

  • -d 입력으로 제공된 일반 파일의 디렉토리를 추적하고 새 파일이 추가되면 종료하십시오. 이 옵션을 사용하면 디렉토리를 명시 적으로 지정할 수도 있습니다. 이름이 ‘.’로 시작하는 파일 무시됩니다.
  • -n비 대화식 모드에서 실행하십시오. 이 모드에서 entr은 TTY를 읽거나 속성을 변경하지 않습니다.
  • -r 지속적 하위 프로세스를 다시로드하십시오. 표준 작동 모드와 마찬가지로 종료되는 유틸리티는 파일 시스템 또는 키보드 이벤트가 처리 될 때까지 다시 실행되지 않습니다. SIGTERM유틸리티를 다시 시작하기 전에 종료하는 데 사용됩니다. 쉘 스크립트가 신호를 마스킹하지 못하도록 프로세스 그룹이 작성됩니다. entr소켓과 같은 자원이 닫혔는지 확인하기 위해 유틸리티가 종료 될 때까지 기다립니다. TTY 제어는 하위 프로세스로 전송되지 않습니다.