inotifywait는 파일이나 디렉터리에 대해 다양한 작업을 수행합니다.

inotifywait는 파일이나 디렉터리에 대해 다양한 작업을 수행합니다.

inotifywait감시 디렉터리에 close_write 플래그가 있는 것을 확인하면 파일과 폴더에 대해 다른 작업을 수행하도록 스크립트를 가져오려고 하는데 검사가 제대로 작동하지 않는 것 같습니다.

나는 다른 스크립트에서 이러한 유형의 검사를 사용해 왔으며 제대로 작동하지만 inotifywait아직 파악하지 못한 것이 있는 것 같습니다.

현재 형식의 스크립트는 다음과 같습니다.

    #!/bin/bash

    dir1=/sambashares

    while true; do
     inotifywait -r -e close_write "$dir1" | while read f; do
      #debug
      echo $f
      #Is it a directory?
      if [[ -d "${f}" ]]; then
       #debug
       echo "New directory called ${f} detected"
       chown -R jake:jake $f
       chmod -R 775 $f
       cp -R $f /media/lacie/Film
      fi
      #Is it a file?
      if [[ -f "${f}" ]]; then 
      #debug
      echo "New file called ${f} detected"
      chown jake:jake $f
      chmod 775 $f
      cp $f /media/lacie/Film
      fi

     done
    done

무슨 일이 일어나고 있는지 확인하기 위해 터미널에서 이것을 실행하면, 내가 얻는 것은 close_write가 감지되었다는 확인과 "set watch"가 뒤따르는 것뿐입니다. 다른 메시지나 다른 코드는 트리거되지 않으며 직접 디버그 에코도 발생하지 않습니다. 수행원:

 while read f; do

:-(

Ubuntu Server 12.04 LTS 64비트에서 실행하고 있습니다.

$ bash --version
GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu)

$ dpkg -l | grep inotify
ii  inotify-tools                    3.13-3
ii  libinotifytools0                 3.13-3
ii  python-pyinotify                 0.9.2-1

$ python --version
Python 2.7.3

답변1

다음은 나에게 효과적이었습니다.

inotifywait자신의 것과 유사한 방법을 사용하는 예가 아래에 나와 있습니다.

$ inotifywait -r -e close_write "somedir" | while read f; do echo "$f hi";done
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.    

그런 다음 디렉토리로 이동하여 somedir파일을 터치하면 창에서 다음과 같은 일이 발생합니다 touch afile.inotifywait

somedir/ CLOSE_WRITE,CLOSE afile hi

노트:모든 출력을 얻으려면 inotifywait예제를 약간 수정하면 됩니다.

$ inotifywait -r -e close_write "somedir" 2>&1 | \
    while read f; do echo "$f | hi";done
Setting up watches.  Beware: since -r was given, this may take a while! | hi
Watches established. | hi

명령을 사용하여 파일을 다시 터치하면 touch afile이제 이벤트가 표시됩니다.

somedir/ CLOSE_WRITE,CLOSE afile | hi

이것을 사용하는 방법을 보여주는 또 다른 예를 보려면 inotifywait이 Q&A에 대한 답변에서 제가 보여준 예를 확인하세요.파일이 크기 제한에 도달하면 자동으로 감지.

너의 문제

내 생각에 당신이 겪고 있는 문제의 일부는 반환된 출력이 inotifywait파일 이름일 뿐이라고 가정하고 있지만 위의 예에서는 분명히 그렇지 않다는 것입니다.

따라서 다음 if진술은 결코 성공하지 못합니다.

  if [[ -d "${f}" ]]; then

and

  if [[ -f "${f}" ]]; then 

이러한 Bash 스크립트를 개발할 때 상단에서 다음 명령을 통해 디버그 메시지를 활성화하는 것이 도움이 되는 경우가 많습니다.

set -x

다음을 통해 비활성화할 수 있습니다.

set +x

이 메시지를 사용하여 코드 섹션을 래핑하여 켜거나 끌 수 있습니다.

set -x
...code...
set +x

답변2

정보를 제공해 주신 slm에게 감사드리며 작동하게 되었습니다 :-)

#!/bin/bash

# Written by Jan Duprez and licensed as
# do whatever you want with this but don't come whining
# if you somehow manage to trash your system with it.
# You pressed the buttons, remember?

# This script uses inotifywait to watch a directory and copies
# files or directories moved into it to another folder.

# The commandline parameters are:
# 1 - Directory to watch
# 2 - Directory where new file/folder is copied to
# 3 - UID to use to chmod the file/folder in BOTH dirs
# 4 - GID to use to chmod the file/folder in BOTH dirs
# 5 - permissions to set for the new file/folder in BOTH dirs

dir1=$1
dir2=$2
user=$3
group=$4
perms=$5

# Check if commandline parameters are all there, show reminder if not
if [[ -z $dir1 || -z $dir2 || -z $user || -z $group || -z $perms ]];
then    
    echo -e "Please provide a source dir as 1st parameter"
            echo -e "Please provide a dest dir as 2nd parameter"
            echo -e "Please provide a UID as 3rd parameter"
            echo -e "Please provide a GID as 4th parameter"
            echo -e "Please provide a file permission string (ex 755) as 5th parameter"
    exit
fi

# Good to go, start watching
while true; do

#add -e close_write and -e create for testing
inotifywait -r -e move "$dir1" | while read f; do

#Get part after inotify triggers with awk, remove leading spaces with sed
new=`echo $f | awk '{$1=$2=""; print $0}' | sed 's/^ *//'`
#And the preconstruded full path to avoid ugly buggery between the  [[ ]]    test
test=$dir1$new

    if [[ -d "${test}" ]] ; then
    chown -R $user:$group "$dir1$new"
    chmod -R $perms "$dir1$new"
    cp -R "$dir1$new" "$dir2"
    chown -R $user:$group "$dir2$new"
    fi

    if [[ -f "${test}" ]] ; then
    chown $user:$group "$dir1$new"
    chmod $perms "$dir1$new"
    cp "$dir1$new" "$dir2"
    chown $user:$group "$dir2$new"
    fi
done
done

관련 정보