将文件夹添加到监视目录时不会触发 inotifywait close_write

Posted

技术标签:

【中文标题】将文件夹添加到监视目录时不会触发 inotifywait close_write【英文标题】:inotifywait close_write does not trigger when folders are added to watched directory 【发布时间】:2020-12-15 08:36:09 【问题描述】:

我正在尝试复制保存到 torrent 保存文件夹的已完成文件。我使用 inotifywait 创建了一个 bash 脚本来监视该文件夹。我的原始脚本非常适合文件和文件夹/子文件夹。一旦我用“-e close_write”替换了“-e create -emoved_to”,它就不再识别保存在监视文件夹中的文件夹。它现在仅适用于文件。我需要更改为这个的原因是因为我的很多文件都很大(并且文件夹中的多个文件)并且需要一些时间才能完全保存并且脚本在完成之前会运行所有进程。

我也尝试过“等待”命令,但它什么也没做。我知道有更复杂/更好/正确的使用方法,但我还没有弄清楚。

这是我的脚本示例。任何指导将不胜感激。我不擅长编写 bash 脚本,如果写得一团糟,请见谅。

WATCHED=/mnt/Seeding
DESTINATION=/mnt/Complete-Torrents
user=userid
group=groupid
perms=777

# Step 1 - Copying completed torrents to Complete-Torrents folder leaving original torrents to seed 
inotifywait -m -e close_write --format %f $WATCHED \
    | while read new
        do
            echo Detected new torrent $new, Copying to Complete-Torrents folder
            cp -r "$WATCHED/$new" "$DESTINATION/"
            wait
                          
# Step 2 - Deleting unwanted files from Complete-Torrents folder

            echo Deleting unwanted files from Complete-Torrents 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 Complete-Torrents folder

            echo Changing ownership and permissions to Complete-Torrents folder and files
            chown -R $user:$group "$DESTINATION"
            chmod -R $perms "$DESTINATION"
                           
        done

谢谢, 肖恩

编辑...

我这辈子都无法获得这个脚本,甚至无法看到添加到监视文件夹的新文件夹。它实际上什么也没做。如果我将close_write 替换为createmoved_to 并且不进行其他更改,它会正确查看文件夹和内容并进行处理。我觉得这很奇怪。

事实上,我什至尝试制作一个小测试脚本,看看我是否可以让它与 if/elif/else 语句一起工作,但是当我在监视文件夹中复制一个文件夹时,脚本什么也不做(doesn' t 甚至进入循环)。如果我放入一个文件,那么它会提供正确的输出。

这是我运行的测试脚本。其他人能否确认他们是否可以正确识别和处理新文件夹?

#!/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

【问题讨论】:

什么是$STEP1_WATCHED 你的测试脚本中“完成”的不是太多吗? 我不明白,。你读过说明书吗? close_write 是怎么说的? Can someone else confirm if they can get a new folder to be recognized and processed correctly? 为什么需要它,阅读手册页后很清楚,close_write 不会检测到新文件夹的创建。它说A watched file or a file within a watched directory was closed, after being opened in writeable mode - 你为什么希望检测到目录创建? KamilCuk...哇。接得好。是的,我已经多次阅读手册,但由于某种原因没有注意到它仅适用于文件。我想如果它特别说“close_write 不会检测到新文件夹的创建”,我会抓住它。但你是对的。谢谢你的收获! Roadowl...是的,您对额外的“完成”是正确的。 KamilCuk 指出 close_write 没有看到文件夹,所以我的主要问题在这一点上不是问题。但我现在需要找到一种不同的方式来做我需要的事情。感谢您的帮助。 【参考方案1】:

事实证明这里的问题是我的错误。在我阅读 inotify 手册的所有时间里,我不知何故没有发现这仅适用于文件而不是文件夹。我显然在寻找一些具体的东西,并且掩盖了手册中关于 close_write 的内容。

感谢所有帮助!

【讨论】:

以上是关于将文件夹添加到监视目录时不会触发 inotifywait close_write的主要内容,如果未能解决你的问题,请参考以下文章

如何监视文件并在终端中打印出更改(使用 inotify)?

FSNotify 在运行时添加监视目录

使用 FileSystemWatcher 监视目录

排除在TypeScript中监视目录

监视添加到目录的文件大小(Bash)

Laravel mix / webpack 不会在通过 babel() 编译的脚本上触发监视功能