inotifywait - 중첩된 if 문에 대한 도움이 필요합니다.

inotifywait - 중첩된 if 문에 대한 도움이 필요합니다.

($WATCHED)/folder 폴더에서 새 파일(.mkv만)을 감시하고 있습니다. 무언가가 나타나면 대상 폴더($DESTINATION)에 복사하고 소유권과 권한을 변경하세요.

이것이 내가 사용하는 스크립트입니다.

#!/bin/bash

WATCHED=/mnt/Watched
DESTINATION=/mnt/Destination
user=usrid
group=grpid
perms=755

inotifywait -re CLOSE_WRITE,CREATE,MOVED_TO --format $'%e\t%w%f' -m $WATCHED |
    while IFS=$'\t' read -r events new
    do

# Detecting and copying new files/folders

        sleep 5
        if [[ -d "$new" ]]
        then
            echo "Folder Detected: $new, Copying to Destination folder"
            cp -r "$new" "$DESTINATION/"
        elif [[ "$events" =~ CLOSE_WRITE ]]
        then
            if [ -f "$new" ] && [ "${new##*.}" == mkv ]
            then
                echo "File Detected: $new, Copying to Destination folder"
                cp -r "$new" "$DESTINATION/"
            elif [[ -e "$new" ]]
            then
                echo "New unknown item '$new'"
            fi
        fi

        echo "Changing ownership and permissions for $DESTINATION"
        chown -R $user:$group "$DESTINATION"
        chmod -R $perms "$DESTINATION"
        echo


    done

이 스크립트에 대해 몇 가지 질문이 있습니다.

  • 폴더가 하나이고 폴더에 파일이 하나뿐인 경우 어떤 이유로 소유권/권한 변경이 3번 실행됩니다. 아래 출력에서 ​​두 번째 인스턴스가 분리되어 있음을 확인할 수 있습니다. 왜 그런지 모르겠어? 나는 이에 대한 나의 입장과 행동이 내가 달성하려는 목표에 적합하지 않다는 것을 알고 있습니다. 전체 대상 폴더가 아닌 복사되는 각각의 새로운 개별 파일/폴더에 대해 소유권/권한을 부여하고 싶습니다. 각 새 파일/폴더의 소유권/권한을 변경하는 올바른 방법이 확실하지 않습니다. 어떤 지침이라도 대단히 감사하겠습니다.
  • 이 스크립트는 정확하고 동일한 디렉터리 트리를 사용하여 폴더와 파일을 디렉터리에 복사할 뿐만 아니라 파일을 대상 폴더에도 복사합니다. 그래서 파일 사본이 두 개 있습니다. 첫째, 대상 폴더에 직접 복사되는 이유는 무엇이며, 둘째, 복사를 방지하려면 어떻게 해야 합니까?

이것이 출력입니다.

Folder Detected: /mnt/Watched/NewFolder, Copying to the Destination folder
Changing ownership and permissions for /mnt/Destination

Changing ownership and permissions for /mnt/Destination

File Detected: /mnt/Watched/NewFolder/NewFile.mkv, Copying to Destination folder
Changing ownership and permissions for /mnt/Destination

이것이 내가 원하는 출력 결과입니다.

Folder Detected: /mnt/Watched/NewFolder, Copying to the Destination folder
Changing ownership and permissions for /mnt/Destination/NewFolder

File Detected: /mnt/Watched/NewFolder/NewFile.mkv, Copying to Destination folder
Changing ownership and permissions for /mnt/Destination/NewFolder/NewFile.mkv

감사해요

답변1

CREATE및 이벤트를 찾고 있지만 CLOSE_WRITE코드에서 분리하지 않습니다.

새 파일이 나타나면 두 가지 이벤트가 모두 생성될 가능성이 높습니다. 먼저 파일이 처음 생성될 때 "CREATE" 이벤트가 생성되고, 실제 쓰기 후 파일이 닫힐 때 "CLOSE_WRITE" 이벤트가 생성됩니다.

파일의 "CREATE" 이벤트는 if 문의 분기를 캡처하지 않으며 "소유권 및 권한 변경..." 부분만 실행됩니다.

파일과 디렉터리에 대해 개별적으로 각 이벤트에 대해 수행할 작업을 결정해야 합니다. 파일에 대한 "CREATE" 이벤트는 파일이 생성되고 쓰기 위해 열리지 않을 때만 "CLOSE_WRITE" 없이 발생하기 때문에 별로 흥미롭지 않을 것입니다. ( 누군가 open(filename, O_CREAT|O_RDONLY)의도적으로 전화를 걸었지만 실패했을 경우 touch발생할 수 있습니다 .)

코드가 실제로 무엇을 얻고 있는지 확인할 수 있도록 수신된 이벤트를 인쇄하는 줄을 추가하는 것이 좋습니다. 예를 들면 다음과 같습니다.

while IFS=$'\t' read -r events new
do
    echo "get event: $events on file $new"

또한 왜 루프에서 호출하는지 잘 모르겠습니다 sleep 5. 스크립트를 지연시키는 것 외에는 아무 것도 하지 않는 것 같습니다.

관련 정보