inotifywait 不显示正确的路径

inotifywait not displaying correct path

我有一个脚本可以自动将电影数据添加到我的网站,并通过使用 inotify 启动其他脚本来为它们下载正确的字幕。所以它只在新文件上运行我需要完整的文件路径,如“/var/www/html/movies/my movie (2020)/”和文件名“my movie (2020).mp4

我尝试了不同的方法来让它工作,例如:

inotifywait -m -r --format "%e %w%f" /var/www/html/uploads/Videos/ -e create -e moved_to |
    while read event fullpath; do

上面没有提取任何文件。

inotifywait -mr --format "%w%f" /var/www/html/uploads/Videos/ -e create -e moved_to |
    while read event fullpath; do

适用于“Freaks (2018)”等电影,但不适用于“Zombieland Double Tap (2019)”,它变成了“ZombielandTap (2019)”

完全不使用 --format 只会完全弄乱一些目录: 2 快 2 狂暴 (2003) 变为:

/dir/22 Furious (2003)/ CREATE 2 Fast 2 Furious (2003).mp4

我对它的确切需求是获取路径和文件名(我分别使用两者)。在非监控文件夹中完成下载后,电影将被移动并从任何 torrent 名称重命名为监控目录中的实际名称。最终文件是我所关心的 link for.

我该怎么做才能分别获取路径和文件名,以便在需要时将它们加在一起(首选),或者我可以用表达式分解的完整路径?

你有几个问题。在您的第一次尝试中,您监视目录,但您通过管道传输 inotifywait 的输出以进行读取。管道不在任何环路内,因此是一次性交易。您仍在监视目录,但您的输出不再连接到您的读取循环。

你的第二次尝试有同样的问题,但是使用 --format "%w%f" 不输出 event,然后尝试 read event fullpath,因为你的文件名包含空格,名称的一部分被读入 event,其余部分被读入 fullpath.

因为您只关心添加到目录的文件 --create 应该是您需要监视的唯一事件。您使用 %w%f 应该没问题,因为您正在监视一个目录,'%w' 将包含被监视的目录 (watched_filename),而 '%f' 将包含文件名 (event_filename).

您正在使用 bash,因此您可以在 bash 中使用 进程替换 来建立目录的递归监控并将文件名提供给 while 循环处理变化。您必须在脚本的其余部分引用结果变量,以避免根据您的使用方式出现分词。

您可以执行类似的操作:

while read -r fullpath
do
    echo "got '$fullpath'"
done < <(inotifywait -m -r --format '%w%f' -e create "/var/www/html/uploads/Videos/")

这将不断地将绝对路径和文件名读入 fullpath 变量。如所写,手表只是回声,例如"got '/var/www/html/uploads/Videos/name of new file.xxx'"

例子Use/Output

将手表设置在带有空格的测试目录 "my dir" 上并在该目录中创建文件(也带有空格)会导致,例如

Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
got '/home/david/tmpd/my dir/my movie1 (2020).mp4'
got '/home/david/tmpd/my dir/my movie2 (2020).mp4'
got '/home/david/tmpd/my dir/my movie3 (2020).mp4'

您可以在需要的任何进一步处理中使用 fullpath。试一试,如果您还有其他问题,请告诉我。