在文件夹中查找文件

吉什努·乌奈尔

我正在尝试制作一个FIFO脚本,当磁盘使用量达到极限时,该脚本会不断删除文件。我使用了该find命令,因此文件数量不会成为运行脚本的限制。但我得到一个错误

/share/capture/per.sh: line 13: find /share/capture/job1/ -type f -name "*.pcap": division by 0 (error token is "share/capture/job1/ -type f -name "*.pcap"")

我制作的脚本如下:

#!/bin/bash

limit=10
#get usage percentage
per=$(df|grep '/dev/sdb.'|awk -F'[^0-9]*' '{print $5}')  
#get folders
dir=($(ls -d /share/capture/*/))
while [[ ${per} -gt $limit ]]
do
 for dirs in "${dir[@]}"; do
  files=(*)
  #get list of all pcap files in those folders 
  files=$((find $dirs -type f -name "*.pcap"))
  len="${#files[@]}"
  if [[ ${len} -gt $limit ]]
  then
   echo "${files[@]:0:10}"
   rm -f "${files[@]:0:10}" #delete 10 files
   fi
 done
#Update per
done
echo $per

这些文件按最旧的顺序排列在阵列顶部。还有关于如何通过中断而不是轮询来运行脚本的任何建议,即,每次将文件添加到捕获中的任何文件夹时,我都希望运行脚本。

我已将脚本修改为以下内容:

   #!/bin/bash  
  limit=8
  file_limit=10
  per=$(df|grep '/dev/sdb.'|awk -F'[^0-9]*' '{print $5}')
  dir=($(ls -d /share/capture/*/))
  while [[ ${per} -gt $limit ]]
  do
  for dirs in "${dir[@]}"; do
   files=(*)
   files=($(find $dirs -type f -name "*.pcap"))
   len="${#files[@]}"
   if [[ ${len} -gt $file_limit ]]
   then
    echo "${files[@]:0:10}"
    rm -f "${files[@]:0:10}"
    fi
   done
   done
    echo $per

错误已解决,但是脚本倾向于删除所有文件,而不仅仅是删除足以使使用百分比降低到极限的文件。我还在做错什么吗?

mjturner

回答问题的第二部分,监视文件系统更改的“最佳”方法是使用inotify(7)

有一组可以挂接到内核接口的实用程序inotify-tools特别是,您希望从该组实用程序进行inotifywait

inotifywait使用Linux的inotify(7)接口有效地等待文件的更改。它适合等待shell脚本中的文件更改。它既可以在事件发生后退出,也可以在事件发生时连续执行和输出。

您可以这样使用它:

#!/bin/sh
while inotifywait -e create /share/capture/*/; do
  /share/capture/per.sh
done

只有在创建新文件时才会调用您的脚本。我并没有测试的例子-我适应它的手册页,所以请适应需要。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章