当文件加载到保管箱文件夹中时,使用inotifywait移动文件


12

我试图找到一种方法,将文件立即出现在CentOS上的保管箱中,立即将其移动到另一个文件夹。

我已经在互联网上搜寻了一些线索,但是除了需要使用inotify一个调用脚本来处理文件的事实以外,我无能为力了。

我的BASH知识非常有限,我怀疑是否可以用PHP编写。

换句话说,如何使用显示的文件立即将其移动到另一个文件夹inotify


文件名是否始终可预测?还是位置?更多详细信息将对您有所帮助……
jasonwryan

@jasonwryan这是一个保管箱文件夹,因此位置一致。它适用于该文件夹中放置的任何文件。
Ortix92 2013年

Answers:


13

这是一种简单的方法:

#!/usr/bin/env bash

dir=/home/ortix/Dropbox/new/
target=/home/ortix/movedfiles/

inotifywait -m "$dir" --format '%w%f' -e create |
    while read file; do
        mv "$file" "$target"
    done

有关要移动的文件类型的更多详细信息,您可以添加一些检查,日志记录等...


我无法测试任何建议的答案。事情来了。会尽快这样做!我确实有一个问题。如果我将其放在bash文件中并运行,我假设它将在后台运行,对吗?我一直感觉脚本是一次运行的东西,但是inotifywait一直在运行,对吗?
Ortix92

2
监听create事件不正确,因为您将对mv可能未完全复制到磁盘上的文件进行操作。参见@Gilles答案,改用close_write事件。
fduff 2014年

3
@fduff看到吉勒斯的答案总是正确的事……
jasonwryan 2014年

17

inotifywait每当指定目录的内容更改时,该命令都会打印一条消息。您需要选择正确的事件:不是在创建文件时,而是在Dropbox完成下载后。我不知道Dropbox的运作方式。如果它最终写入文件,请侦听close_write事件。如果它将文件写入临时位置,然后将其移到适当位置,请侦听moved_to事件。将选项传递给-m -qinotifywait以便它继续监听事件(默认情况下,它仅等待下一个事件),并且仅打印相关消息。

cd ~/Dropbox/myfolder
inotifywait -m -q -e close_write --format %f . | while IFS= read -r file; do
  cp -p "$file" /path/to/other/directory
done

1
对于名称中包含换行符的文件,此操作将失败。我无法找到inotifywait输出以空值结尾的文件名的方法。我所能做的最好的事情就是使用比换行符少的字符,例如%f$'\001'-d $'\001'while IFS= read -r或一起使用xargs
暂停,直到另行通知。

1
@DennisWilliamson是的,这inotifywait很烦人。您可以使用诸如之类的东西//%f,因为只要观看路径不包含文件名,文件名就永远不会包含双斜杠。那么烦恼就在解析方面。
吉尔斯(Gilles)'所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.