![7日以上経過したファイルのみ削除: -mtime および find](https://rvso.com/image/134439/7%E6%97%A5%E4%BB%A5%E4%B8%8A%E7%B5%8C%E9%81%8E%E3%81%97%E3%81%9F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%81%BF%E5%89%8A%E9%99%A4%3A%20-mtime%20%E3%81%8A%E3%82%88%E3%81%B3%20find.png)
類似した質問がいくつか見つかりましたが、完全に一致していませんでした。
バックアップ用のディレクトリ (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 +7
、m+7
は、経過日数を次の整数に切り捨てた値が 7 より大きいファイルに一致します。したがって、 は、8 日以上経過したファイル ( を使用する場合のよくある落とし穴) に一致しますfind
。
古い隠しファイルも削除するには、D
glob 修飾子を追加します。
一致するファイルがない場合、エラー メッセージが表示されます。N
glob 修飾子を追加することでこれを回避できます (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
。