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