我有一个名为/home/user/local
的目录。每隔两分钟左右,新文件将被转储到此目录中。我需要每2分钟检查一次这个目录,看看是否有新的文件/文件落在那里。如果有新文件,我需要将它的列表放入变量中以便稍后使用。我该怎么做这个shell脚本?
答案 0 :(得分:6)
#! /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
快速&amp;脏的方式。 :)它将监视目录中的更改,不仅是在新文件被转储时,而且还有一些文件丢失/删除。
文件列表存储在变量$cur_files
。
答案 1 :(得分:2)
inotifywait
正是您所寻找的:http://linux.die.net/man/1/inotifywait
答案 2 :(得分:0)
设置一个运行脚本的cron作业,该脚本获取当前列表并将其与存储在某个文件中的旧列表进行比较。
答案 3 :(得分:0)
假设您的变量名为$ 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
并将此脚本放入cmd:crontab -e的crontab中 格式:
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>
答案 4 :(得分:0)
首先非常感谢leafei,我希望这很容易。然而,对于我的设备来说,为循环编写临时文件对于我当前的project而言不够便携,我需要对受监控目录中可能发生的各种事情执行操作,所以这里是我根据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
希望这会有所帮助。