私は次のスクリプトを書いた。
#!/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
非標準の拡張ですが、find
Ubuntuの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 f
zsh
(/)
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 {} \;