3

У меня есть каталог а и каталог б. В каталоге a периодически появляются новые файлы и папки. Я хотел бы отслеживать папку a для этих новых файлов и автоматически копировать их в папку b. К сожалению, из-за некоторых организационных сценариев, которые я ранее настроил в каталоге b, я не могу использовать rsync для этих целей, поскольку структура папок в месте назначения, скорее всего, будет слишком сильно различаться между запусками rsync.

Есть ли какая-нибудь альтернативная настройка, которую я могу использовать?

2 ответа2

4

Другой способ сделать это - использовать 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 -e как описано в разделе @ MariusMatutiae в ответ и добавьте эту строку в ней:

    @reboot /usr/bin/watch_dir.sh 
    

Теперь, каждый раз, когда вы перезагружаетесь, каталог будет автоматически отслеживаться, и новые файлы копируются из источника в цель.

1

Вы можете настроить запуск crontab каждые N минут. Задание будет искать файлы, измененные менее N минут назад, и копировать их в новое место назначения.

Например, если вы хотите запускать файл /home /my_name /bin /custom каждые 10 минут, вы редактируете свой файл crontab с помощью команды

 crontab -e

и добавьте следующую строку в конце:

 */10 * * * * /home/my_name/bin/custom

Файл 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 /, независимо от их происхождения. Конечно, вы должны настроить логин без пароля, чтобы это работало.

Если вместо этого вы хотите сохранить структуру каталогов (то есть не складывать все в одном каталоге, измените вышеприведенное, как указано ниже:

 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/{} ' \;

Здесь нет проверки ошибок, измените, как считаете нужным.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .