shell监控目录下新增的文件并进行处理

文章描述了一个使用shell脚本实现的自动过程,用于监控指定目录的新文件上传。通过ls列出文件、diff比较新旧文件列表、以及检查文件大小变化来判断上传是否完成,每分钟检查一次,直到一天结束。脚本由CronTab定期重启。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用户每天上传文件到指定目录,通过shell脚本尽快识别到新上传的文件已经上传完成,然后就处理新上传的文件。

通过ls记录文件名列表到临时文件中,然后通过diff比较识别新增的文件;
通过文件的大小变化判断新增文件是否上传完成,连续10秒大小不变就认为上传完成了。
每分钟检查一次,循环运行一天后退出,然后通过crontab脚本每天拉起

#!/bin/bash
#0 0 * * * /root/crontab/checkDirFile.sh
current_date=$(date +%Y-%m-%d\ %H:%M:%S)
tomorrow_date=$(date -d tomorrow +%Y-%m-%d\ %H:%M:%S)
#末尾带/
dir_to_check=/path/to/check/
echo "start at $current_date $dir_to_check"
while true;do
	sleep 1
	current_date=$(date +%Y-%m-%d\ %H:%M:%S)
	echo "$current_date" |tee heartbeat.txt
	# 只监控一天,然后就退出,通过crontab再拉起
	if [[ "$current_date" > "$tomorrow_date" ]]; then
	  echo "only run one day,shell will exit,then crontab will run a new shell."
	  break
	fi
	ls "$dir_to_check" > temp2.txt
	echo $current_date
	diff file_name_list.txt temp2.txt | grep ">" >> added_files.log
	diff file_name_list.txt temp2.txt | grep ">" | awk '{print $2}' | while read -r line;do
		current_date=$(date +%Y-%m-%d\ %H:%M:%S)
		file_name="$dir_to_check$line"
		echo "$file_name $current_date"
		#如果文件连续10秒没有变化大小则认为文件已经传输完成
		prev_size=$(du -b $file_name | awk '{print $1}')
		count=0
		while [ $count -lt 10 ]
		do
			echo $count
			current_size=$(du -b "$file_name" |awk '{print $1}')
			if [ $current_size -eq $prev_size ] ; then
			  echo "no change ${count} ${current_size}"
			  count=$((count + 1))
			else
			echo "changed"
			count=0;
			fi
			prev_size=$current_size
			sleep 1
		done
		echo "file no change, upload completed. "
		#do some things here
		echo  "${file_name}"
	done
	mv temp2.txt file_name_list.txt
	sleep 59
done
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值