1

我必须编写一个脚本,每 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

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

4

3 回答 3

1

ls用来列出目录、wc计数、diff显示添加/删除的文件、sed过滤掉目录/符号链接和差异元数据,以及 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 Unice,则 diff 元数据过滤器如下所示:

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

丑陋吧?

于 2013-09-19T07:04:54.537 回答
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
于 2013-09-19T07:29:41.667 回答
0

你想这样做多久?下面这个简单的代码将监控 60 秒。要获得无穷大,请将for循环更改为while true; do(然后计时器不会增加,因此将 refs 删除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
于 2013-09-19T07:07:20.533 回答