"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')を含む、または1つ以上のタブ文字()で始まるファイルまたはディレクトリ名ではtouch $'\ttabbed'失敗します。ヌル文字()を含む書式文字列がinotifywait使用できないためです。\000イベントが発生する可能性がありますが、ループが処理されターゲットタイプが評価される前にターゲットが削除または置換される可能性がある小さな競合状態もあります。

おすすめ記事