2日が経過した特定のディレクトリ名の下のすべてのファイルを繰り返し削除します。

2日が経過した特定のディレクトリ名の下のすべてのファイルを繰り返し削除します。

私は次のスクリプトを書いた。

#!/bin/bash
DAYSOLD="2"
users_dir="/users"
cd $users_dir
date >> cleanup.log;  du -h --max-depth=1 | sort -hr >> cleanup.log
find $users_dir -mtime +$DAYSOLD -type f -exec rm -v {} \;

「ワークスペース」ディレクトリから2日以上経過したファイルのみを削除したいと思います。どうすればこれを行う必要がありますか?

/users/user1/workspace
/users/user2/workspace
/users/user3/workspace

助けてくれてありがとう。これを行う方法を学びたいです。

答え1

-mtime "+$days"(最後の修正時間に基づく)丸められたファイルの選択下に日数は整数です。厳しくより良い$days...

2日23時間を過ぎたファイル-mtime +2は2日が過ぎた2

したがって、以下が必要です。

find "$users_dir"/*/workspace -mtime "+$(( DAYSOLD - 1 ))" -type f -delete

$DAYSOLDを削除するには、次のworkspaceことも$users_dirできます。

find "$users_dir"/*/workspace '(' -mtime "$DAYSOLD" -o -mtime "+$DAYSOLD" ')' \
                   -type f -delete

$DAYSOLD寿命(整数日数)が。以上のファイルを削除します$DAYSOLD

-delete非標準の拡張ですが、findUbuntuのGNUで使用でき、使用するよりも優れています-exec rm-delete -print正常に削除されたファイルのリストを作成できます。

覚えて変数参照cdそして、1を実行する前に終了ステータスを確認してください。(cd -P -- "$users_dir" && exec du...)それ以外のdu場合は、失敗した場合は間違ったディレクトリで実行されますcd。また、サブシェルの使用に注意してください。それ以外の$users_dir場合は相対パスの場合は正しく機能しません。実際には、次のように書く方が合理的です。

cd -P -- "$users_dir" || exit
du ...
find . ...

$users_dir(シンボリックリンクならより一貫性があるでしょう)


厳密に言えば言葉だ。少なくとも数$DAYSOLD日前にしかし、比較がナノ秒精度で実行され、開始に数百ナノ秒かかることを考慮すると、findこれらの区別はほとんど意味がない。

² 厳密に言えば、ifworkspaceが非形式ファイルの場合目次、そのファイルは引き続き渡され、ファイルが数日find以上古い場合(通常のファイルの場合)、そのファイルも削除されます。このモードに切り替えて追加して、ディレクトリタイプファイルのみが考慮されるようにすることができます。する$DAYSOLD-type fzsh(/)workspaceいいえ追加するだけで/、以下の3がより深刻な結果をもたらす可能性があります(たとえば、またはへの/users/joe/workspaceシンボリックリンクの場合)。/bin/

³の後にはシンボリックリンクが続きます。たとえば、/users/joeシンボリックリンクの場合、/ディレクトリ/workspace内の古いファイルは削除されます。

答え2

これを試してみてください

find $users_dir/user*/workspace -mtime +$DAYSOLD -type f -exec echo rm -v {} \;

期待通りに動作するとエコーが減ります。日付を真夜中から始まるものとして処理するには、-daystartを追加することをお勧めします。

もう一つの簡単な方法は -path を使うことです。

find  $users_dir -path "$users_dir/user*/workspace/*" -mtime +$DAYSOLD -type f -exec echo rm -v {} \;

関連情報