"inotifywait -e close_write"는 감시 디렉터리의 새 폴더를 무시합니다.

"inotifywait -e close_write"는 감시 디렉터리의 새 폴더를 무시합니다.

감시 폴더에 저장된 완성된 파일을 복사하려고 합니다. 폴더를 모니터링하기 위해 inotifywait를 사용하여 bash 스크립트를 만들었습니다.

내 원본 스크립트는 파일 및 폴더/하위 폴더에 적합합니다. "-e create -e Moving_to"를 "-e close_write"로 바꾸면 더 이상 감시 폴더에 저장된 폴더를 인식/처리하지 않습니다. 이제는 파일에서만 작동합니다. 이것을 변경해야 하는 이유는 많은 파일이 크고(폴더에 여러 파일이 있음) 완전히 저장하는 데 시간이 걸리고(감시 폴더에) 파일이 저장되기 전에 스크립트가 모든 파일을 실행하기 때문입니다. 저장된 프로세스. 정확하게 저장/복사하세요.

또한 "wait" 명령을 시도했지만 아무 것도 수행되지 않았습니다. 나는 그것을 사용하는 더 복잡하고 더 좋고 올바른 방법이 있다는 것을 알고 있지만 아직 그것을 알아내지 못했습니다. inotify에서 "close_write" 이벤트를 찾은 후 다음 프로세스를 시작하기 전에 현재 프로세스/명령이 완료될 때까지 기다리면 필요한 작업을 정확히 수행할 수 있을 것 같은 느낌이 듭니다. 큰 단일 파일을 완벽하게 처리하지만 폴더가 감시 폴더에 복사될 때마다 MIA가 발생합니다(아무 작업도 수행하지 않음).

다음은 내 스크립트의 예입니다. 저는 bash 스크립트를 잘 작성하지 못해서, 엉망이었다면 죄송합니다.

#!/bin/bash

WATCHED=/mnt/Watched
DESTINATION=/mnt/Destination
user=userid
group=groupid
perms=777

# Step 1 - Copying completed files to Destination folder

inotifywait -m -e close_write --format %f $WATCHED \
    | while read new
        do
            echo Detected new file $new, Copying to Destination folder
            cp -r "$WATCHED/$new" "$DESTINATION/"
            wait
                          
# Step 2 - Deleting unwanted files from Destination folder

            echo Deleting unwanted files from Destination folder
            find $DESTINATION -type f -iname "*.txt" -delete
            find $DESTINATION -type f -iname "*.nfo" -delete
            find $DESTINATION -type f -iname "*.website" -delete
            find $DESTINATION -type f -iname "*.exe" -delete
            find $DESTINATION -type f -iname "*.html" -delete
            find $DESTINATION -type f -iname "*.htm" -delete
            find $DESTINATION -type f -iname "*.sfv" -delete
            find $DESTINATION -type f -iname "*.parts" -delete
            find $DESTINATION -type f -iname "*.jpg" -delete
            find $DESTINATION -type f -iname "*.png" -delete
            find $DESTINATION -type f -iname "*.doc" -delete
            sleep 10
                           
# Step 3 - Change permissions of new files in Destination folder

            echo Changing ownership and permissions to Destination folder and files
            chown -R $user:$group "$DESTINATION"
            chmod -R $perms "$DESTINATION"
                           
        done

어떤 지침이라도 대단히 감사하겠습니다.

감사해요

편집하다...

평생 동안 이 스크립트를 사용하여 감시 폴더에 추가된 새 폴더를 볼 수는 없습니다. 실제로는 아무것도 수행하지 않습니다. close_write& 로 create바꾸고 다른 내용을 변경하지 않으면 moved_to폴더와 내용이 올바르게 표시되고 처리됩니다. 나는 이것이 매우 이상하다고 생각합니다.

사실, if/elif/else 문과 함께 작동하도록 할 수 있는지 확인하기 위해 작은 테스트 스크립트를 작성하려고 시도했지만 watch 폴더의 폴더를 복사하면 스크립트가 다시 아무 작업도 수행하지 않습니다(어떤 작업도 수행하지 않음). ) 루프로). 파일을 넣으면 올바른 출력이 제공됩니다.

다음은 제가 실행한 테스트 스크립트입니다. 새 폴더를 올바르게 인식하고 처리할 수 있는지 확인할 수 있는 사람이 있습니까?

#!/bin/bash
WATCHED=/mnt/Watched
inotifywait -re close_write --format '%w%f' -m $STEP1_WATCHED \
    | while read -r new
        do
            if [[ -d "$new" ]]; then            
            echo "Detected new folder $new"
            elif [[ -f "$new" ]]; then            
            echo "Detected new file $new"
            else
            echo "neither $new"
            fi
            done
    done

답변1

스크립트에서 생성된 디렉토리가 표시되지 않는 이유는 다음 CLOSE_WRITE대신에 CREATE찾고 있기 때문입니다 IS_DIR.

inotifywait .           # Terminal 1
Setting up watches.
Watches established.
./ CREATE,ISDIR zz

mkdir zz                # Terminal 2

이제 CREATE결정의 일부로 프로젝트 유형을 테스트해야 하는 파일에도 적용할 수 있습니다.

#!/bin/bash
watchDir=/mnt/watched

inotifywait -qre CLOSE_WRITE,CREATE --format $'%e\t%w%f' --monitor "$watchDir" |
    while IFS=$'\t' read -r events item
    do
        if [[ -d "$item" ]]
        then
            echo "New directory '$item'"

        elif [[ "$events" =~ CLOSE_WRITE ]]
        then
            if [[ -f "$item" ]]
            then
                echo "New file '$item'"

            elif [[ -e "$item" ]]
            then
                echo "New unknown item '$item'"
            fi
        fi
    done

이 코드는 개행 문자( touch $'break\nfile')를 포함하거나 하나 이상의 탭 문자()로 시작하는 파일 또는 디렉토리 이름에 대해 touch $'\ttabbed'실패합니다. 널 문자()가 포함된 형식 문자열을 inotifywait사용할 수 없기 때문입니다. \000이벤트가 발생할 수 있지만 루프가 처리되고 대상 유형이 평가되기 전에 대상이 제거되거나 교체될 수도 있는 작은 경쟁 조건도 있습니다.

관련 정보