使用された容量が95%に達すると、ビジボックスから最も古い50 GBのファイルが削除されます。

使用された容量が95%に達すると、ビジボックスから最も古い50 GBのファイルが削除されます。

まあ、ここにコードを要求しましたが、最初はビジボックスと互換性があるように頼んでいませんでした。私のせい。私はLinuxとコーディングに初めて触れました。

コードは次のことを行う必要があります。

ハードドライブの容量が95%に達すると、ディレクトリ(ファイルがあるディレクトリ)から最も古いデータの50 GBが削除されます。

彼らが私に与えたコードはbusyboxとは動作しませんでした:

DIRS="a/ b/"
MAXDELBYTES="53687091200" # 50GB
DELBYTES="0"

find $DIRS -type f -printf "%T@ %s %p\n" | sort -r -n | while read time bytes filename
do
    rm -fv "$filename"
    DELBYTES=$((DELBYTES + bytes))

    if [ $DELBYTES -ge $MAXDELBYTES ]; then break; fi
done

うまくいかないもの:

  • -printf(-printに変更)
  • %T@ %s %p\n(何を変更するのか分からない)
  • 他に何がうまくいかないのかわかりません。私はコーディングとLinuxに初めて触れました。

これで、組み込みLinuxシステムで実行できるようにbusyboxに変換する必要があります。また、毎週金曜日に実行するようにcronコマンドを追加する必要があります。

答え1

~から忙しい箱実装する探すカスタム出力形式は提供されていないため、書式設定タスクを別のプログラムにアウトソーシングする必要があります :)busybox幸いにもstat注文する。出力形式フィールドは次のように異なります。GNUを探す用途が異なるため、使用すべき記号も異なります。以下のスクリプトでは、合計がから来たと仮定していfindます。statbusybox

DIRS="a/ b/"
MAXDELBYTES="53687091200" # 50GB
DELBYTES="0"

find $DIRS -type f -exec stat -c "%Y %s %n" {} \; | sort -r -n | while read time bytes filename
do
    rm -fv "$filename"
    DELBYTES=$((DELBYTES + bytes))

    if [ $DELBYTES -ge $MAXDELBYTES ]; then break; fi
done

いつものように、各コマンドを使用する前に、そのコマンドの説明をお読みください。その場合、busyboxそのマンページが見つかりませんが、--helpマンページを使用して使用情報を表示できます。

この回避策は、ファイル名に改行文字が含まれていると問題が発生する可能性があることに注意してください。通常のシステムではこれは起こらないでください。たとえば、誰かがシステムに侵入したり、任意のファイルを生成する可能性があるいくつかの脆弱性を悪用した場合に発生する可能性があります。

このような状況で役に立つファイルを誤って削除しないようにするには、まず名前に改行を含むすべてのファイルを見つけて削除する必要があります。これを一覧表示するには、次の手順を実行します。

find / -name "*
*"

(持っているただアスタリスクの間に改行があります。 )その後、これらのファイルがすべて必要ないと確信している場合は、次のいずれかの方法でファイルを削除してください。

find / -name "*
*" -delete

または

find / -name "*
*" -print0 | xargs -0 rm -vf

両方と連携する必要がありますbusybox

答え2

一般的に言えば、出力を解析するのは悪い考えです。ls。ただし、statzsh、Perl、またはその他の大規模なスクリプト言語を持たない組み込みシステムでは、find -printfこれが日付ごとにファイルをソートする唯一の方法です。ファイル名に空白や空白\'"xargs破損する可能性がある)がないと仮定すると(元のスクリプトで想定されているとおり)、日付でソートされたxargs ls -strファイルを表示してプロセスサイズで表示できます。

find $DIRS -type f |
xargs ls -str |
while read kilobytes filename; do …

サイズはバイトではなくキロバイトで表されます。また、これはファイルのバイト数ではなく、ファイルが占めるディスク容量です。通常、この数値は次の整数ブロックに丸められたファイルサイズです。足りない。ディスク容量を確保するスクリプトでは、これが望むものかもしれません。

上記のスクリプトには大きな注意があります。ファイル数が十分に少ない場合は、xargsソートできますls。複数回呼び出すと、ls各呼び出しは引数を個別にソートします。印刷ファイルの日付を使用できますが、ls人間が読める出力を並べ替えるのは非常に複雑です。少なくともエラー条件を検出するためのより良いソリューションはfind

{ set -f; IFS='
'; ls -str $(find $DIRS -type f); } |
while read -r kilobytes filename; do …

関連情報