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 将休眠直到被操作系统唤醒,
它会输出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

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

于 2013-11-11T16:52:49.057 回答