まあ、ここにコードを要求しましたが、最初はビジボックスと互換性があるように頼んでいませんでした。私のせい。私は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
ます。stat
busybox
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
。ただし、stat
zsh、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 …