7日以上経過したファイルのみ削除: -mtime および find

7日以上経過したファイルのみ削除: -mtime および find

類似した質問がいくつか見つかりましたが、完全に一致していませんでした。

バックアップ用のディレクトリ (sql) があり、そのディレクトリ内の 7 日以上経過したすべてのファイルを削除し、サブディレクトリはそのまま残したいと考えています。

私が持っているのは次のものです:

find /var/log/mbackups -mtime +7 -type f -delete

これは私が求めているものを達成するための適切な方法でしょうか?

答え1

コマンドは最上位ディレクトリを調べ/var/log/mbackups、サブディレクトリまで降りて、7 日間の条件に一致するファイルを削除します。ディレクトリ自体は削除されません。

ディレクトリ内のファイルのみを参照するコマンドが必要な場合/var/log/mbackupsサブディレクトリに降りない、その制限を追加する必要があります:

find /var/log/mbackups -maxdepth 1 -mtime +7 -type f -delete

一般的に、アクションを次のような無害なものにfind置き換えることでコマンドをテストできます(が示すように、ここでもが必要です)。-delete-print-depth-delete-depth

find /var/log/mbackups -depth -mtime +7 -type f -print

答え2

zshの場合:

rm -f /var/log/mbackups/*(.m+6)

と同じ:

rm -f /var/log/mbackups/*(.^m-7)

.は、隠しファイルではなく、過去 7 日間に変更されていない通常のファイル ( を含む) を削除します。findの の場合と同様に-mtime +7m+7は、経過日数を次の整数に切り捨てた値が 7 より大きいファイルに一致します。したがって、 は、8 日以上経過したファイル ( を使用する場合のよくある落とし穴) に一致しますfind

古い隠しファイルも削除するには、Dglob 修飾子を追加します。

一致するファイルがない場合、エラー メッセージが表示されます。Nglob 修飾子を追加することでこれを回避できます (rmこの場合、 はファイル名引数なしで呼び出されますが、 を使用すると-f、エラー メッセージは表示されません)。

答え3

免責事項:私はrawhide(rh)の現在の著者です(https://github.com/raforg/rawhide

ほぼ、非常に近いです。あなたの試みの正しいバージョンは次のとおりです。

find /var/log/mbackups -maxdepth 1 -mtime +6 -type f -delete

もしあなたが見つけたら探す-mtime述語引数が直感的に不十分な場合は、生皮rh) その代わり:

rh -UUU -r /var/log/mbackups 'f && old(7*days)'

-UUU一致をリンク解除/削除/削除します。

-rのようなものです探す-mindepth 1 -maxdepth 1検索パスの 1 レベル下のディレクトリのみを検索するため、サブディレクトリは検索されません。

f通常のファイルと一致します。

old(7*days)少なくとも 7 日前に最後に変更されたものと一致します。

答え4

警告:-deleteは非標準(移植性なし)であり、使用時には危険を伴います gfind

rmにはセキュリティ上の制限があることに留意してください。ただし、gfindのマニュアル ページにはそのような制限については記載されていません-delete。したがって、公式の方法を使用することをお勧めします。

find /var/log/mbackups -mtime +7 -type f -exec rm {} +

これは、 を使用する非標準の方法よりも遅くはありません-delete

関連情報