我正在使用下面的命令来复制最后一分钟创建的文件。我安排包含此命令的脚本每一分钟运行一次,以便在 a/b/c 位置创建文件后立即复制文件。但是,不知何故,此命令有时无法复制一个或多个文件。 find 命令有什么缺点吗?或者以下命令有错误吗?
find /a/b/c -type f -mmin -1 -exec cp {} /x/y/z \;
答案1
您可以使用find
时间戳标志,以便它获取自上次运行以来的所有文件,无论那是多久前的事。请随意$trigger
用更合适的内容替换 的定义。
trigger=/tmp/trigger
touch "$trigger.new"
test ! -f "$trigger" && touch "$trigger"
find /a/b/c -newer "$trigger" -type f -exec cp -f {} /x/y/z +
mv -f "$trigger.new" "$trigger"
在以下情况下这仍然会失败时间文件完全写入后重置。
如果此代码运行时正在写入源文件,它仍然会失败。除非您能保证源文件以原子方式出现,否则非常值得防范这种情况。处理此问题的一种方法是使用.tmp
(或)后缀写入文件.part
,并仅在完成后由发件人重命名。find
此处的触发脚本将被修改为排除名称以 (或 ) 结尾的.tmp
文件.part
。
您也可以使用rsync
,但请注意源中的目录路径将被复制到目标,这可能不是您想要的。将上面的代码片段替换为这一行:
rsync -a /a/b/c/ /x/y/z/