如何寻找是否有一个目录的新文件中的shell脚本每2分钟?(How to find if there

2019-08-02 09:49发布

我有一个名为目录/home/user/local 。 每隔两分钟左右的时间,一个新的文件转储到这个目录。 我需要这个目录检查,每2分钟,看是否有新的文件/文件已在那里降落。 如果有新的文件,我需要把它的名单到一个变量以后使用。 我该怎么做这个shell脚本?

Answer 1:

#! /usr/bin/env bash

FILELIST=/tmp/filelist
MONITOR_DIR=/home/usr/local

[[ -f ${FILELIST} ]] || ls ${MONITOR_DIR} > ${FILELIST}

while : ; do
    cur_files=$(ls ${MONITOR_DIR})
    diff <(cat ${FILELIST}) <(echo $cur_files) || \
         { echo "Alert: ${MONITOR_DIR} changed" ;
           # Overwrite file list with the new one.
           echo $cur_files > ${FILELIST} ;
         }

    echo "Waiting for changes."
    sleep $(expr 60 \* 2)
done

一个快速和肮脏的方式。 :)它会监控目录的变化,不仅当有倾倒在新文件中,也如果有些文件丢失/删除。

文件列表存储在变量$cur_files



Answer 2:

inotifywait正是你在找什么: http://linux.die.net/man/1/inotifywait



Answer 3:

建立一个运行脚本,它的当前列表,并将其与存储在文件中的某个地方的旧房源cron作业。



Answer 4:

比方说你的变量称为$ listOF

创建一个脚本:

listOfFiles=`ls -t /home/user/local`
for i in $listOfFiles
do
echo "$listOF" | grep $i
if [[ "$?" -eq "0" ]]
then
listOF=$listOF" "$i
fi
done

并把这个脚本放到crontab中通过CMD:crontab -e命令格式:

1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59 * * * * <path to your script>


Answer 5:

首先非常感谢您leafei,我希望它是那么容易。 然而,对于我的设备编写临时文件的循环是不是我不够电流便携式项目 ,我需要一个监控目录中可能发生的各种事情进行操作,所以这里是我写的基于断leafei的答案,并在本地测试脚本。 注格式化也许起飞的第一篇文章...

#!/usr/bin/env bash
Var_monitor_dir="${1?No directory passed}"
Var_sleep_time="${2:-120}"
Var_diff_opts="--suppress-common-lines"
Func_parse_change(){
    _added_input="$(grep -E ">" <<<"${@}")"
    _removed_input="$(grep -E "<" <<<"${@}")"
    if [ "${#_added_input}" != "0" ]; then
            mapfile -t _arr_added <<<"${_added_input}"
            let _added_count=0
            until [ "${#_arr_removed}" = "${_added_count}" ]; do
                _current_path="${_arr_removed[${_added_count}]}"
                if [ -f "${_current_path}" ]; then
                    echo "# ${0##*/} detected added file: ${_current_path}"
                elif [ -d "${_current_path}" ]; then
                    echo "# ${0##*/} detected added directory ${_current_path}"
                elif [ -p "${_current_path}" ]; then
                    echo "# ${0##*/} detected added named pipe ${_current_path}"
                fi
                ## Ignore other added input and add to index counter
                let _added_count++
            done
            unset _added_count
    fi
    if [ "${#_removed_input}" != "0" ]; then
            mapfile -t _arr_removed <<<"${_added_input}"
            let _removal_count=0
            until [ "${#_arr_removed}" = "${_removal_count}" ]; do
                echo "# Removal detected: ${_arr_removed[${_removal_count}]}"
                let _removal_count++
            done
    fi
 }
 Func_watch_dir(){
    _current_listing=""
    while [ -d "${Var_monitor_dir}" ]; then
         _new_listing="$(ls "${Var_monitor_dir}")"
         _diff_listing="$(diff ${Var_diff_opts} <(echo "${_current_listing}") <(echo "${_new_listing}"))"
        if [ "${#_diff_listing}}" != "0" ]; then
            Func_parse_change "${_diff_listing}"
        fi
        _current_listing="${_new_listing}"
        sleep ${Var_sleep_time}
    done
}
if [ "${#@}" != "0" ]; then
     Func_watch_dir
     exit 0
else
     echo "${0##*/} needs a directory to monitor"
     exit 1
if

假设上述被保存为monitor_directory.sh和目录被监视的/tmp然后打开一个端子和输入monitor_directory "/tmp" (或monitor_directory.sh "/tmp" "10"为具有测试之间更快的更新)将开始该检查更改循环。 然后打开第二终端尝试输入以下,并等待所述第一终端以更新

mkdir -p /tmp/test_dir
touch /tmp/test.file

等待时间结束后的第一终端应报告文件和目录已经出现,如果你运行的追随者,并等待它再次将展示清除了。

rmdir /tmp/test_dir
rm /tmp/test.file

希望这有助于一些。



文章来源: How to find if there are new files in a directory every 2 minutes in shell script?
标签: bash shell unix