フォルダ内のファイルを探す

フォルダ内のファイルを探す

ディスク使用量が制限に達すると、ファイルを削除し続ける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

質問の2番目の部分に答えるために、ファイルシステムの変更を監視するための「最も良い」方法はinotify(7)

カーネルインターフェイスに接続する一連のユーティリティがあります。イノティファイツール。特にあなたが望むinotify待つこのユーティリティセットでは:

inotifywait は、Linux の inotify(7) インタフェースを使用してファイルの変更を効果的に待ちます。シェルスクリプトでファイルの変更を待つのに適しています。イベントが発生した後に終了することも、イベントが発生している間もイベントを実行して出力することもできます。

次のように使用できます。

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

新しいファイルが生成されたときにのみスクリプトが呼び出されます。私がやったいいえテスト例 - マンページを基準に修正しましたので、必要に応じて修正してください。

おすすめ記事