Shell脚本用于计算在1秒内插入和删除的文件数

时间:2013-09-19 03:39:53

标签: shell unix

我必须编写一个脚本,每1秒计算一次目录中的文件数。

for item in /d:/new_dir/*
do
if [ -f $item ]
then
     FILECOUNT=$[$FILECOUNT+1]
fi
done
     echo -e "No of files are $FILECOUNT\r\c";
FILECOUNT=0
sleep 1s
done

但我希望看到在两次迭代之间添加或删除了哪些文件。 请告诉我在上面的代码中需要修改哪些修改。

3 个答案:

答案 0 :(得分:1)

我正在使用ls列出目录,wc计数,diff显示已添加/已删除的文件,sed用于过滤dirs / symlinks和diff元数据和bash流程替换<()欺骗diff认为它比较2个文件,同时只比较2个变量。

#!/bin/bash
dir=$1
old=`ls -1F $dir | sed '/[\/@]$/d'`
while true; do
  new=`ls -1F $dir | sed '/[\/@]$/d'`
  echo "$new" | wc -l | sed 's/^/No of files is /'
  diff -u <(echo "$old") <(echo "$new") | sed -r '/^((\+\+)|(--)|(@@)| )/d'
  old=$new
  sleep 1
done

添加的文件将显示为+foo,已删除的文件将显示为-foo

如果您使用的是Mac或其他非GNU Unices,则差异元数据过滤器如下所示:

sed '/^\(\(++\)|\(--\)|\(@@\)| \)$/d'

丑陋,是吗?

答案 1 :(得分:0)

您想要为此做多久?下面这个简单的代码将监视60秒。要获得无穷大,请将for循环更改为while true; do(然后计时器不会增加,因此请删除参考I)注意空格!

获取ls的文件数比循环更快

NUMFILES=$(ls | wc -l)
echo "T : NUM : DIFF"
for I in {1..60}; do 
   sleep 1
   NEWNUM=$(ls | wc -l)
   echo $I : $NUMFILES : $[$NEWNUM-$NUMFILES]
   NUMFILES=$NEWNUM
done

答案 2 :(得分:0)

这个简单的脚本应该可以使用内部bash数组:

a1=( * )
while :; do
   echo "Num of files at present => " ${#a1[@]}
   if [[ $a2 && ${#a1[@]} != ${#a2[@]} ]]; then
      [[ ${#a2[@]} > ${#a1[@]} ]] && echo "new files added =>" && \
                      grep -v -f <(printf "%s\n" "${a1[@]}") <(printf "%s\n" "${a2[@]}")
      [[ ${#a1[@]} > ${#a2[@]} ]] && echo "existing files deleted =>" && \
                      grep -v -f <(printf "%s\n" "${a2[@]}") <(printf "%s\n" "${a1[@]}")
      a1=( * )
   fi
   sleep 5
   a2=( * )
done