ファイルがディレクトリにコピーされると、自動的にコマンドを実行する

ファイルがディレクトリにコピーされると、自動的にコマンドを実行する

同じコンピュータの異なるパスにあるAとBという2つのフォルダがあります。フォルダAに新しいファイルを追加すると、自動的にフォルダBにコピーしたいと思います。

私のファイル:

/auto/std1/nat1/A
/auto/std2/nat2/B

現在のファイルをコピーするために実行する作業は次のとおりです。

cp -r A B

しかし、私はこのプロセスをバックグラウンドで自動的に実行しAたいと思いますB

質問/質問が追加されました

ファイルをコピーするときは、特定のファイル形式に対して特定のタスクを実行したいと思います。たとえば、zipフォルダにファイルがある場合は、フォルダのファイルAに自動的にコピーされます。unzipB

これはCentOS 7`システムにあります。

答え1

rsyncボーナスの質問に従って、下記のシェルスクリプトのコマンドの下に次の行を追加してください。私はこれをコメントしましたが、正式にここに私の答えに追加します。

    find /auto/std2/nat2/B -name '*.zip' -exec sh -c 'unzip -d `dirname {}` {}' ';'

rsyncこれにより、フォルダから/auto/std2/nat2/Aコピーされたすべてのzipファイルの解凍が処理されます。/auto/std2/nat2/B



rsyncすでにインストールしている場合は、cronを実行してrsyncファイルミラーを管理していますか?

スクリプトの作成myrsyncscript.sh

実行可能にすることを忘れないでください。chmod 700 myrsyncscript.sh

#!/bin/sh

LOCKFILE=/tmp/.hiddenrsync.lock

if [ -e $LOCKFILE ]
        then
        echo "Lockfile exists, process currently running."
        echo "If no processes exist, remove $LOCKFILE to clear."
        echo "Exiting..."
#        mailx -s "Rsync Lock - Lock File found" [email protected] <<+
#Lockfile exists, process currently running.
#If no processes exist, remove $LOCKFILE to clear.
#+
        exit
fi

touch $LOCKFILE
timestamp=`date +%Y-%m-%d::%H:%M:%s`
echo "Process started at: $timestamp" >> $LOCKFILE

## Run Rsync if no Lockfile
rsync -a --no-compress /auto/std1/nat1/A /auto/std2/nat2/B


echo "Task Finished, removing lock file now at `date +%Y-%m-%d::%H:%M:%s`"
rm $LOCKFILE

オプション分析:

-a is for archive, which preserves ownership, permissions etc.
--no-compress as there's no lack of bandwidth between local devices

考慮できる他のオプションman rsync:

- 既存の無視

シンクのファイル更新をスキップする

- 更新

これにより、rsyncがターゲットに存在し、ソースファイルよりも変更時間が最新のすべてのファイルをスキップします。 (既存のファイルの変更時間がソースファイルの変更時間と同じでサイズが異なる場合は更新されます。)これは、シンボリックリンクやその他の特殊ファイルのコピーには影響しません。さらに、送信者と受信者の間のファイル形式の違いは、オブジェクトの日付に関係なく常に更新されるほど重要であると見なされます。つまり、ソースにディレクトリがあり、ターゲットにファイルがある場合、タイムスタンプに関係なく転送が行われます。

このオプションは除外ではなく転送ルールなので、ファイルのリストに入るデータと削除には影響しません。単に受信者が転送を要求するファイルを制限します。

次のようにcronに追加し、最も快適であると感じる周波数に周波数を設定します。

cronを開き、crontab -e次を追加します。

### Every 5 minutes
*/5 * * * * /path/to/my/script/myrsyncscript.sh > /path/to/my/logfile 2>&1 

# * * * * *  command to execute
 # │ │ │ │ │
 # │ │ │ │ │
 # │ │ │ │ └───── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
 # │ │ │ └────────── month (1 - 12)
 # │ │ └─────────────── day of month (1 - 31)
 # │ └──────────────────── hour (0 - 23)
 # └───────────────────────── min (0 - 59)

答え2

inotifywaitとリズムイベントレスポンスを使用して@Izkataの提案を実装し、rsyncを5分ごとに最大1に保ちながら、最初の変更にすばやく応答します。

#!/bin/sh
# usage: whateveryouwanttotcallthis "$directorytowatch" rsync args here

cd "$1" || { echo "${0##*/}: can't cd to $1"; exit 1; }
shift
rsync -nq "$@" || { echo "rsync doesn't like your $# arguments $@"; exit 1; }

notbefore=0
watchlock=.lock.inotifywait
rsynclock=.lock.rsync-pending

mkdir $watchlock ||
       { echo "${0##*/}: already running, rmdir '$PWD/$watchlock' if kill -9 took it out"
         exit 1;
       }
trap "rmdir '$watchlock'" 0 1 2 3 15

inotifywait -m -e close-write . |    # maybe also add move
        while read; do
                mkdir $rsynclock 2>&- || continue
                schedule=$(( notbefore <= (now=`date +%s`+2) ? (now+2)
                                                           : (notbefore) ))
                notbefore=$((schedule+300))
                ( ( trap "rmdir '$rsynclock'" 0 1 2 3 15
                    sleep $(( schedule-now ))
                  )
                  # substitute your payload here
                  rsync --exclude='.lock.*' "$@" \
                          || echo ssia | mail -s "${0##*/} '$PWD' rsync failed" opswatch
                ) &
        done

2秒の遅延は、小さなバーストのバッチ処理に役立ち、書き込みが完了したときに特定の項目の名前を変更する時間を許可します。たぶん15秒が良いかもしれません。

Windows ATMではテストできませんが、少なくとも非常に似ていると思います。

答え3

DevNullを使用して、定期的に再同期されるコンテンツを提案できます。個人的に使用しますinotify。これはフォルダを監視するのに最適なツールです。ウォッチポイントを設定し、ファイルシステムの変更が発生したときに通知します。その後、.NETのトリガーに基づいてrsyncをトリガーできますinotify

最後に述べた特定のケースでは、inotifyのトリガーを使用して変更を確認し、単純なbashスクリプトを作成してフォルダAに追加されたzipファイルであることを確認し、その場合は代わりにzipをコピーするだけでフォルダB(または必要なものタスク)に解凍できます。

関連情報