30日以上経過したファイルの検索と削除

30日以上経過したファイルの検索と削除

30日を過ぎたユーザーファイルを削除したいと思います。以下のbashスクリプトはうまく動作します。しかし、独自のエコーがあるので、出力に表示されている「対応するファイルまたはディレクトリなし」エラーを取り除きたいと思います。誰でも助けることができますか?

パスワード:

if [[ $(find /h/$USER/*.txt -mtime +30) ]]
then
    find /h/$USER/*.txt -mtime +30 -print -exec rm -f {} \;
else
    echo "No txt files to del"
fi

出力:

find: stat() error /h/username/*.txt: No such file or directory
No text files to del

答え1

これが私のやり方です。毎晩整理したい複数のディレクトリで実行することです。

find /h/$USER -maxdepth 1 -name "*.txt" -type f -mtime +30 -delete

これが最善なのか最悪なのかは言えませんが、何年も問題なく実行されてきました。

答え2

ここでの問題は、findtxtファイルをリストするのではなくシェルglobを使用していることです(隠しtxtファイルを除いて、ファイルがディレクトリタイプの.txt場合はそのファイルに入り、古いファイルをすべて削除します)。このようなシェルは、bashglobがどのファイルとも一致しないときにglobをそのまま渡し、find存在findしない*.txtファイルについて文句を言います。

次のことができます。

LC_ALL=C find "/h/$USER/." ! -name . -prune \
  -name '*.txt' ! -type d -mtime +30 -print -exec rm -f {} + |
  grep '^' > /dev/null || echo >&2 No text files to del

これは、出力が生成されたかどうか(エラーなし)grepを確認するためであるため、find出力します。削除するテキストファイルがありません。それ以外の場合はメッセージが表示されます(> /dev/null削除したいファイルを本当に表示するには削除してください)。findプロセスの終了ステータスが失われることに注意してください。

zshglobを使用してファイルの寿命を確認することもできます(すでにzsh引用せずに構文を使用しています$USER)。

oldfiles=(/h/$USER/*.txt(NDm+30^/))
if (($#oldfile)); then
  rm -f -- $oldfiles
else
  echo >&2 No text files to del
fi

とにかく、-find -mtime +30およびzshのglob修飾子のm+30場合、期間を整数日数で比較するため、31日以上のファイルを選択することに注意してください。 30日から23時間を過ぎたファイルは、その期間が30日に丸められ、30より大きくないため選択されません。

答え3

次のコマンドを使用して、エラーを/ dev / nullにリダイレクトします。これによりエラーは表示されません。

find path -type f -daystart -mtime +30 -exec rm -rvf {} \;  2>/dev/null

答え4

12月のファイルを削除したいとしましょう。最初にファイルをリストし、ls -l|grep "Dec" 2番目に満足したら、削除rmls -l|grep "Dec" フィードバックを教えてください。 :)

関連情報