6

以前、単純なfindコマンドを使用して、過去x日間(この例では3日間)にアクセスされなかったtarファイルを削除しました。

find /PATH/TO/FILES -type f -name "*.tar" -atime +3 -exec rm {} \;

アクセス日の順に削除してこのスクリプトを改善する必要があります。bashの書き込みスキルは少し錆びています。これが私がそれをするために必要なことです:

  1. ディレクトリのサイズを確認してください/PATH/ TO / FILES
  2. 1)のサイズがXサイズより大きい場合は、アクセス日ごとにファイルのリストを取得します
  3. サイズがX未満になるまで、ファイルを順番に削除します

ここでの利点は、キャッシュディレクトリとバックアップディレクトリです。制限内に収めるために必要なものだけを削除しますが、1日が特に大きい場合は、簡略化された方法でサイズ制限を超える可能性があります。statとbashforループを使用する必要があると思いますか?

4

3 に答える 3

10

brunner314の例を改善し、その問題を修正しました。

これが私が使用している作業スクリプトです:

#!/bin/bash
DELETEDIR="$1"
MAXSIZE="$2" # in MB
if [[ -z "$DELETEDIR" || -z "$MAXSIZE" || "$MAXSIZE" -lt 1 ]]; then
    echo "usage: $0 [directory] [maxsize in megabytes]" >&2
    exit 1
fi
find "$DELETEDIR" -type f -printf "%T@::%p::%s\n" \
| sort -rn \
| awk -v maxbytes="$((1024 * 1024 * $MAXSIZE))" -F "::" '
  BEGIN { curSize=0; }
  { 
  curSize += $3;
  if (curSize > maxbytes) { print $2; }
  }
  ' \
  | tac | awk '{printf "%s\0",$0}' | xargs -0 -r rm
# delete empty directories
find "$DELETEDIR" -mindepth 1 -depth -type d -empty -exec rmdir "{}" \;
于 2012-08-16T05:50:10.690 に答える
5

これを行うために私が思いついた、シンプルで読みやすく理解しやすい方法を次に示します。

DIRSIZE=$(du -s /PATH/TO/FILES | awk '{print $1}')
if [ "$DIRSIZE" -gt "$SOMELIMIT" ]
  then
    for f in `ls -rt --time=atime /PATH/TO/FILES/*.tar`; do
    FILESIZE=`stat -c "%s" $f`
    FILESIZE=$(($FILESIZE/1024))

    DIRSIZE=$(($DIRSIZE - $FILESIZE))
    if [ "$DIRSIZE" -lt "$LIMITSIZE" ]; then
        break
    fi
done
fi
于 2012-07-26T03:54:47.890 に答える
1

ループを使用する必要はありませんでした。statとawkを注意深く適用するだけです。以下の詳細と説明、最初にコード:

find /PATH/TO/FILES -name '*.tar' -type f \
| sed 's/ /\\ /g' \
| xargs stat -f "%a::%z::%N" \
| sort -r \
| awk '
  BEGIN{curSize=0; FS="::"}
  {curSize += $2}
  curSize > $X_SIZE{print $3}
  '
| sed 's/ /\\ /g' \
| xargs rm

これは1つの論理コマンドラインですが、正気のために分割したことに注意してください。

それは、3日より古いファイルに制限する部分なしで、上記のものに基づく検索コマンドで始まります。それをsedにパイプし、ファイル名のスペースをエスケープしてreturnを見つけ、xargsを使用してすべての結果に対してstatを実行します。-f "%a ::%z ::%N"は、使用する形式をstatに指示します。最初のフィールドには最後のアクセス時刻、2番目のフィールドにはファイルのサイズ、第3。ファイル名のスペースをそのように処理する方が簡単なので、フィールドを区切るために「::」を使用しました。次に、Sortは最初のフィールドでそれらをソートし、-rを使用して順序を逆にします。

これで、関心のあるすべてのファイルのリストが、最後にアクセスされたファイルから最も早くアクセスされたファイルの順に表示されます。次に、awkスクリプトはリストを通過するときにすべてのサイズを合計し、$X_SIZEを超えるとそれらの出力を開始します。この方法で出力されないファイルは保持されたファイルになり、他のファイル名は再びsedに移動してスペースをエスケープし、次にxargsに移動してそれらを実行します。

于 2012-07-23T21:56:10.560 に答える