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
ここでの問題は、find
txtファイルをリストするのではなくシェルglobを使用していることです(隠しtxtファイルを除いて、ファイルがディレクトリタイプの.txt
場合はそのファイルに入り、古いファイルをすべて削除します)。このようなシェルは、bash
globがどのファイルとも一致しないときに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
プロセスの終了ステータスが失われることに注意してください。
zsh
globを使用してファイルの寿命を確認することもできます(すでに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"
フィードバックを教えてください。 :)