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

このスクリプトについていくつかの質問があります。

  • フォルダが1つでフォルダに1つのファイルしかない場合は、何らかの理由で所有権/権限の変更が3回実行されます。以下の出力から2番目のインスタンスが分離されていることを確認できます。なぜそんなのか分からない?私はこれに対する私の立場と行動が私が達成しようとしている目標には適していないことを知っています。ターゲットフォルダ全体ではなく、コピーされる新しい個々のファイル/フォルダごとに所有権/権限を付与したいと思います。各新しいファイル/フォルダの所有権/権限を変更する正しい方法はわかりません。どんな指針でも大変感謝いたします。
  • このスクリプトは、正確で同じディレクトリツリーを使用してフォルダとファイルをディレクトリにコピーするだけでなく、ファイルをターゲットフォルダにコピーします。したがって、ファイルのコピーが2つあります。まず、コピー先フォルダに直接コピーされるのはなぜですか。

これが出力です。

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。スクリプトを遅らせる以外には何もしないようです。

おすすめ記事