Bash脚本,监视文件夹,执行命令

52

我正在尝试创建一个带有两个参数的Bash脚本:

  • 一个目录
  • 一个命令

我想要监视目录参数以进行更改:当有更改时,脚本应该执行该命令。

我正在运行MacOS,而不是Linux;任何指针或外部资源都将非常有帮助,因为我发现这很难实现。实际上,我正在尝试模仿SASS的watch功能。

#!/bin/bash

#./watch.sh $PATH $COMMAND

DIR=$1  

ls -l $DIR > $DIR/.begin
#this does not work
DIFFERENCE=$(diff .begin .end)

if [ $DIFFERENCE = '\n']; then
    #files are same
else
    $2
fi 

ls -l $DIR > $DIR/.end
13个回答

0

这里有一个模板可供使用,它将每120秒检查传递目录中的更改,并在创建目录、文件或命名管道时通知。如果您还想在删除某些内容时运行命令,请查看我在stackoverflow上的其他答案以获取额外的循环示例。

#!/usr/bin/env bash
Var_dir="${1:-/tmp}"
Var_diff_sleep="${2:-120}"
Var_diff_opts="--suppress-common-lines"
Func_parse_diff(){
    _added="$(grep -E '>' <<<"${@}")"
    if [ "${#_added}" != "0" ]; then
        mapfile -t _added_list <<<"${_added//> /}"
        _let _index=0
        until [ "${#_added_list[@]}" = "${_index}" ]; do
            _path_to_check="${Var_dir}/${_added_list[${_index}]}"
            if [ -f "${_path_to_check}" ]; then
                echo "# File: ${_path_to_check}"
            elif [ -d "${_path_to_check}" ]; then
                echo "# Directory: ${_path_to_check}"
            if [ -p "${_path_to_check}" ]; then
                echo "# Pipe: ${_path_to_check}"
            fi
            let _index++
        done
        unset _index
    fi
}
Func_watch_bulk_dir(){
    _current_listing=""
    while [ -d "${Var_dir}" ]; do
        _new_listing="$(ls "${Var_dir}")"
        _diff_listing="$(diff ${Var_dec_diff_opts} <(${Var_echo} "${_current_listing}") <(${Var_echo} "${_new_listing}"))"
        if [ "${_diff_listing}" != "0" ]; then
            Func_parse_diff "${_diff_listing}"
        fi
        _current_listing="${_new_listing}"
        sleep ${Var_diff_sleep}
    done
}

提示:如果你用eval <some command>替换上面的echo行来监控每种类型的操作,你就更接近自动化操作了。如果你想看看上面在脚本中使用的效果,那就查看我一直在为通过gpg和tar实现加密和解密自动化而努力工作的项目的最新版本 script version吧。

0

Radek的回答对我(OSx)“有点”有效,但它会减慢我的终端速度。我对它进行了一些修改,这是我认为适合我的:

#!/bin/bash

daemon() {
    chsum1=""
    targetFolder=path-to-target-folder

    while [[ true ]]
    do
        chsum2=`find ${targetFolder} -type f | xargs stat -f "%m" | md5`
        if [[ $chsum1 != $chsum2 ]] ; then
            # echo the date to indicate we are updating   
            date
            ./do-something.sh
            # tracks the check-sum
            chsum1=$chsum2
        fi
        # sleep for 2 secs
        sleep 2
    done
}

daemon 

关键在于:

chsum2=`find ${targetFolder} -type f | xargs stat -f "%m" | md5`

这意味着查找${targetFolder}中的所有文件,将其逐个传输到stat -f“%m”中,然后将其传输到md5stat -f“%m”[filepath]可提供最后修改时间戳。

请帮我改进它。谢谢!


0

好的,让我纠正一下。这个方法可以用来接收文件,但不能响应更改。我通过花费整整一周的时间试图模拟Dropbox才发现这一点。所以我的观点是,你不能完全“监视”一个文件夹,特别是对于文件夹操作。https://dev59.com/FVjUa4cB1Zd3GeqPS53I - ThomasReggi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接