查找文件夹中的文件

查找文件夹中的文件

我正在尝试制作一个 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

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

答案1

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

有一组实用程序可以挂接到内核接口,inotify 工具。特别是,你想要inotify等待从该组实用程序中:

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

你可以这样使用它:

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

只有在创建新文件时才会调用您的脚本。我做到了不是测试示例 - 我根据手册页对其进行了修改,因此请根据需要进行修改。

相关内容