($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
. 스크립트를 지연시키는 것 외에는 아무 것도 하지 않는 것 같습니다.