当专门命名为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
答案 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
在补丁之前,我们通过设置一个标志来禁用跟随的路径,这样每个文件只会发生一次修补。