特定の条件(ファイル数、ファイル期間)からファイルを削除する

特定の条件(ファイル数、ファイル期間)からファイルを削除する

ファイル数(1時間前のファイル)を計算して1000個を超えると、すべてのファイルを削除するシェルスクリプトを作成したいと思います。

読み取りと削除のためにパテで次のコマンドを使用します。

計算のため:

ls /tmp/ | grep 'ci_session*' | wc -l

ファイル削除の場合:

cd /tmp/
find . -name "ci_session*" -exec rm {} \;

#更新:削除するには1時間以上経過したファイルのみを削除したいと思います。

ここでは、ファイルの総数が1000を超える場合は、条件を追加してから削除コマンドを呼び出したいと思います。

答え1

あなたの質問は、「ファイル数をどのように計算し、1000を超える場合は1時間以上古いファイルを削除しますか?」と解釈されます。

一致する名前を数えて/tmp/ci_session*1000を超える場合は、次の操作を実行してください。

set -- /tmp/ci_session*
if [ "$#" -gt 1000 ]; then
    # something
fi

これにより、位置パラメータがパターンと一致する名前に設定されます。その後、特殊変数には$#位置引数の数が含まれます。

/tmp/ci_session*最後に変更された時間が1時間以上の場合は、一致するファイルを削除します。

find /tmp -maxdepth 1 -type f -name 'ci_session*' -mmin +60 -delete

総合してみると:

#!/bin/sh

set -- /tmp/ci_session*
if [ "$#" -gt 1000 ]; then
    find /tmp -maxdepth 1 -type f -name 'ci_session*' -mmin +60 -delete
fi

ここで注目すべき唯一のことはカウントですどのパターンと一致する名前(ディレクトリ名がある場合でも)、findコマンドは削除を次に制限します。一般ファイル(つまりディレクトリではありません)

答え2

オプションがfindある限り、次のことができます。-mmin

シェルスクリプトを使用してください。

#!/bin/sh

files_dir=/tmp
file_count=$(find "$files_dir" -name 'ci_session*' -mmin 60 -exec echo x \; | wc -l)

if [ "$file_count" -gt 1000 ]; then
    find "$files_dir" -name 'ci_session*' -mmin 60 -exec rm {} \;
fi

file_countパターンに一致する指定されたディレクトリに見つかったファイルの数に設定されます。

1000より大きい場合は、file_countfindを再実行してファイルを削除します。


Bashを使用すると、配列クエリを使用して2番目の呼び出しを削除できます。

#!/bin/bash

files_dir=/tmp
mapfile -t files < <(find "$files_dir" -name 'ci_session*' -mmin 60)

if ((${#files[@]}>1000)); then
    rm "${files[@]}"
fi

注:予想されるファイル数によっては、bashソリューションのコマンドライン引数に問題が発生する可能性があります。限界

関連情報