0

具体的に xxx.java および yyy.java という名前のファイルがダウンロード フォルダーにダウンロードされると、差分ファイルを使用して透過的にバックグラウンドで自動的にパッチを適用したいと考えています。

ls を使用してディレクトリを監視しようとしましたが、次のステップは困難です:-

#! /usr/bin/env bash

MONITOR_DIR=/home/hduser/Downloads
set x = 1
while : ; do
   cur_files=$(ls ${MONITOR_DIR})
   for i in cur_files
      { 
         if[ "$i" = "xxx.java" ]; then      
          patch $i < foo.patch
          set x = 0
         fi
         if[ "$i" = "yyy.java" ];then
          patch $i < bar.patch
          if [ "$x" eq 0];then break; fi    #doesn't work

         fi
     }

     sleep 4
done
4

2 に答える 2

2

投票しないでください!inotifywait を使用します。

#!/bin/bash

MONITOR_DIR="/home/hduser/Downloads"
PATCHED_DIR="/path/where/the/patched/files/are/moved/to"
PATCHES="/path/where/the/patches/are"  

inotifywait -q -m -e close_write "$MONITOR_DIR" |\
while read _DUMMY DUMMY FILENAME
do
    case "$FILENAME" in
    "xxx.java" ) patch="foo.patch" ;; 
    "yyy.java" ) patch="bar.patch" ;; 
    "zzz.java" ) patch="qqq.patch" ;;
    esac

    mv "$MONITOR_DIR/$FILENAME $PATCHED_DIR/$FILENAME"
    patch "$PATCHED_DIR/$FILENAME" < "$PATCHES/$patch" &
done

inotifywait は、ファイルがディレクトリに書き込まれている場合、OS によって起動されるまでスリープし、
出力されますwatched_filename EVENT_NAMES event_filename
(パイプを介して FILENAME に読み込まれた event_filename のみを使用します)。

ステートメントを使用してcase、パッチを選択します。

次に、ファイルを別のディレクトリに移動し、そこに (バックグラウンドで) パッチを適用し始めます。パッチ適用が開始されると、すぐに次のファイルを待つ (スリープ状態になる) 準備が整います。

(ああ、忘れないでください、の後にスペースなどを入れては|\いけません)

于 2013-11-08T04:24:14.990 に答える
0

簡単に説明します。これは非常に簡単です。

#!/bin/bash

MONITOR_DIR="/home/hduser/Downloads"
PATCHES="/path/where/the/patches/are"  

GoPatch()    { patch "$MONITOR_DIR/$1" < "$PATCHES/$2" ;}    

inotifywait -q -m -e close_write "$MONITOR_DIR" |\
while read _DUMMY DUMMY FILENAME
do
    case "$FILENAME" in
    "xxx.java" ) [ $xflag ] || { xflag=x ; GoPatch xxx.java foo.patch ;} ;; 
    "yyy.java" ) [ $yflag ] || { yflag=x ; GoPatch yyy.java bar.patch ;} ;; 
    "zzz.java" ) [ $zflag ] || { zflag=x ; GoPatch zzz.java bof.patch ;} ;; 
    esac
done

パッチを適用する前に、フラグを設定してフォロー パスを無効にして、パッチ適用がファイルごとに 1 回だけ行われるようにします。

于 2013-11-11T16:52:49.057 に答える