ファイル数(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_count
findを再実行してファイルを削除します。
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ソリューションのコマンドライン引数に問題が発生する可能性があります。限界。