監視フォルダに保存されている完成したファイルをコピーしようとしています。フォルダを監視するために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
イベントが発生する可能性がありますが、ループが処理されターゲットタイプが評価される前にターゲットが削除または置換される可能性がある小さな競合状態もあります。