在 Debian 中将新文件从受监控的文件夹复制到另一个文件夹

在 Debian 中将新文件从受监控的文件夹复制到另一个文件夹

我有目录 a 和目录 b。目录 a 定期会将新文件和文件夹复制到其中。我想监视文件夹 a 中的新文件并自动将它们复制到文件夹 b。不幸的是,由于我之前在目录 b 中设置的一些组织脚本,我无法使用 rsync 来实现这些目的,因为目标文件夹的结构在 rsync 运行之间很可能相差太大。

是否有任何我可以使用的其他设置?

答案1

另一种方法是使用inotify

  1. 安装inotify-tools

     sudo apt-get install inotify-tools
    
  2. 编写一个小脚本,用于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
    
  3. 保存该脚本$PATH并使其可执行,例如:

     chmod 744 /usr/bin/watch_dir.sh
    
  4. 让它在每次机器重新启动时运行,创建一个 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/{} ' \;

这里没有错误检查,请根据需要进行修改。

相关内容