用于监视目录以创建文件并修改文件的脚本

时间:2013-11-08 01:45:07

标签: bash

当专门命名为xxx.java和yyy.java的文件下载到我的下载文件夹时,我想使用我的diff文件透明地自动在后台修补它们。

我尝试使用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

2 个答案:

答案 0 :(得分: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将一直睡到操作系统唤醒 它将输出watched_filename EVENT_NAMES event_filename
(我们只使用通过管道读入的event_filename到FILENAME中)。

通过使用case语句,我们选择了一个补丁。

然后我们将文件移动到另一个目录并开始在那里修补(在后台)。 当补丁开始时,我们立即准备等待(睡眠)下一个文件。

(哦,不要忘记|\必须 NOT 后跟空格或其他内容)

答案 1 :(得分: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

在补丁之前,我们通过设置一个标志来禁用跟随的路径,这样每个文件只会发生一次修补。