감시 폴더에 저장된 완성된 파일을 복사하려고 합니다. 폴더를 모니터링하기 위해 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
이벤트가 발생할 수 있지만 루프가 처리되고 대상 유형이 평가되기 전에 대상이 제거되거나 교체될 수도 있는 작은 경쟁 조건도 있습니다.