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
。试一试,如果您还有其他问题,请告诉我。
我有一个脚本可以自动将电影数据添加到我的网站,并通过使用 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
。试一试,如果您还有其他问题,请告诉我。