我有目录 a 和目录 b。目录 a 定期会将新文件和文件夹复制到其中。我想监视文件夹 a 中的新文件并自动将它们复制到文件夹 b。不幸的是,由于我之前在目录 b 中设置的一些组织脚本,我无法使用 rsync 来实现这些目的,因为目标文件夹的结构在 rsync 运行之间很可能相差太大。
是否有任何我可以使用的其他设置?
答案1
另一种方法是使用inotify
:
安装
inotify-tools
包sudo apt-get install inotify-tools
编写一个小脚本,用于
inotifywatch
检查文件夹是否有更改,并将任何新文件移动到目标目录:#!/usr/bin/env bash ## The target and source can contain spaces as ## long as they are quoted. target="/path/to/target dir" source="/path to/source/dir"; while true; do ## Watch for new files, the grep will return true if a file has ## been copied, modified or created. inotifywatch -e modify -e create -e moved_to -t 1 "$source" 2>/dev/null | grep total && ## The -u option to cp causes it to only copy files ## that are newer in $source than in $target. Any files ## not present in $target will be copied. cp -vu "$source"/* "$target"/ done
保存该脚本
$PATH
并使其可执行,例如:chmod 744 /usr/bin/watch_dir.sh
让它在每次机器重新启动时运行,创建一个 crontab (
crontab -e
,如@MariusMatutiae 中所述回答),并添加以下行:@reboot /usr/bin/watch_dir.sh
现在,每次重新启动时,目录都会自动被监视,新文件将从源复制到目标。
答案2
您可以设置一个 crontab 作业,每 N 分钟运行一次。该作业将搜索少于 N 分钟前修改的文件,并将它们复制到新目标。
例如,如果你想每 10 分钟运行一次文件 /home/my_name/bin/custom,你可以通过以下命令编辑 crontab 文件
crontab -e
并在末尾添加以下行:
*/10 * * * * /home/my_name/bin/custom
文件自定义,可由
chmod 755 custom
可能是这样的:
#!/bin/sh
cd /directory/to/be/monitored
find . -type f -mmin -10 -exec sh -c ' file={}; base=${file##*/}; \
scp {} me@remotemachine:/target/directory/$base ' \;
此命令递归搜索目标目录中修改时间少于 (-mmin -10) 十分钟的文件,并将s
它们复制到新目标。它会将所有文件放入同一目录 /target/directory,无论其来源如何。当然,您必须设置无密码登录才能使其正常工作。
如果您希望保留目录结构(即不将所有内容堆积在同一个目录中,请按如下方式修改上述内容:
find . -type f -mmin -10 -exec sh -c ' file={}; base=${file##*/}; \
dirpath=${file%/*}; ssh me@remotemachine mkdir -p /target/directory/$dirpath ; \
scp {} me@remotemachine:/target/directory/{} ' \;
这里没有错误检查,请根据需要进行修改。