我必须编写一个脚本,每 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
但我想查看在两次迭代之间添加或删除了哪些文件。请告诉我我需要在上面的代码中进行哪些修改。
我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'
丑陋吧?
这个简单的脚本应该适合您使用内部 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
你想这样做多久?下面这个简单的代码将监控 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