「stat」を使用して新しいファイルを検索し、別のディレクトリに移動するにはどうすればよいですか?

「stat」を使用して新しいファイルを検索し、別のディレクトリに移動するにはどうすればよいですか?

最終的には、新しいバックアップファイルがディレクトリに配置されたことを検出し、別のタスクのためにその新しいファイルを別の場所に移動したいと思います。

これはサーバーにログインしている人がいない場合に機能するはずです。タスクを開始するために使用するスクリプトはcrontabエントリによってトリガーされます。

私は次のように「inotifywait」を使ってみました。

dir=/home/userid/drop/
target=/home/userid/current/

inotifywait -m "$dir" --format '%w%f' -e create |
    while read file; do
        mv "$file" "$target"
    done

これは、ターミナルウィンドウセッションが開いている場合にのみ機能します。 crontabエントリを使用してこのsciptを無人で起動しようとすると、inotifywaitコマンドは無視されます。

だから「entr」を使ってみましたが、同じ問題が見つかりました。ターミナルウィンドウが開いている場合にのみ機能します。 entrを使用してスクリプトを生成し、crontabエントリを使用して無人実行すると、inotifywaitの例のように無視されます。

だから私はこれが「stat」を使って行うことができることを知っており、多くの例を見て、私の目的に合わせて見つけようとしましたが、その構文を理解していません。

statがディレクトリに新しいファイルがあるかどうかを検出できることを知っていますが、新しいファイルを別の場所に移動するためにmv(move)コマンドの実行をトリガーするために結果を処理する方法がわかりません。

これを実行できる統計構文がある場合は、それを永久に実行する必要があります。たぶん15秒ごとに1回だけチェックすることですが、常にファイルを移動する準備ができているはずです。

誰もがこれを行った経験があり、他のコマンドを実行するためにstat接続構文を助けることができる場合は感謝します。私は他の2つの解決策のために、誰もがSSHパテウィンドウを24時間年中無休にすることを想像することはできないので、他の人もこれを行う方法を知りたいと思います。

よろしくお願いします。

バークマン

答え1

あなたが必要とするのはですincronincronUbuntu / Debianがある場合は、まずパッケージをインストールしてください。

sudo apt install incron

またはRed Hat / Fedoraコマンドを使用してください。

sudo yum install incron

お気に入りのテキストエディタでファイルを開き、/etc/incron.allow次のようにしますvim

vim /etc/incron.allow

bob彼が使用できるように、ユーザー名を新しい行に追加します(と仮定)incron

bob

incron次にルールエディタを開きます。

incrontab -e

そして次の行を追加してください:

/home/userid/drop/ IN_CREATE mv /home/userid/drop/$# /home/userid/current/

どこに新しく削除された検出されたバックアップファイルの名前を表す組み込みのワイルドカードが$#あります。incronincron

生成されたルールをテストするには、ディレクトリにファイルを追加し、削除されたファイルがそのディレクトリに/home/userid/drop/移動されたことを確認します。/home/userid/current/また、システムログを確認してください。

tail /var/log/syslog

答え2

定期的なcronタスクは時々実行されるため不適切ですが、inodeの変更に反応するプロセスは常に実行する必要があります。@reboot(希望的に)永遠に実行されるタスクを開始するだけで十分です。

$ crontab -l
@reboot /home/jhqdoe/job
$ cat job
#!/bin/sh
dir=/home/jhqdoe/drop/
target=/home/jhqdoe/current/
inotifywait -m "$dir" --format '%w%f' -e create \
| while read file; do mv -- "$file" "$target"; done
$ sudo reboot

可能であれば、initシステムで管理する起動デーモンを使用する方が良い選択かもしれません。これらのデーモンは、さまざまな理由で操作が失敗した場合に再起動する方が簡単です。

関連情報