我必须编写一个脚本,每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
但我希望看到在两次迭代之间添加或删除了哪些文件。 请告诉我在上面的代码中需要修改哪些修改。
答案 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