0

我有一个脚本可以自动将电影数据添加到我的网站,并通过使用 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 fast 2 furious (2003) 变成:

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

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

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

4

1 回答 1

1

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

您的第二次尝试也有同样的问题,但是由于您的文件名包含空格,因此使用that--format "%w%f"不输出.eventread event fullpatheventfullpath

由于您只关心添加到目录中的文件,因此--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'"

示例使用/输出

在带有空格的测试目录上设置监视"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在需要的任何进一步处理中使用。试一试,如果您还有其他问题,请告诉我。

于 2020-07-03T05:52:37.553 回答