폴더에서 파일 찾기

폴더에서 파일 찾기

디스크 사용량이 한계에 도달하면 파일을 계속 삭제하는 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기다려이 유틸리티 세트에서:

inotifywait는 Linux의 inotify(7) 인터페이스를 사용하여 파일 변경을 효과적으로 기다립니다. 쉘 스크립트에서 파일 변경을 기다리는 데 적합합니다. 이벤트가 발생한 후에 종료할 수도 있고, 이벤트가 발생하는 동안 계속해서 이벤트를 실행하고 출력할 수도 있습니다.

다음과 같이 사용할 수 있습니다.

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

새 파일이 생성될 때만 스크립트가 호출됩니다. 내가 해냈어아니요테스트 예시 - 맨페이지를 기준으로 수정하였으니 필요에 따라 수정해 주시기 바랍니다.

관련 정보