今日作成されていないファイルをすべて削除する方法

今日作成されていないファイルをすべて削除する方法

delete all今日作成されていないフォルダのファイルが欲しいです。以下を使用して、今日生成されたファイルのリストを取得する方法を知っています。

find . -type f -mtime -1

ところで、今日作成されていないすべてのファイルのリストを取得する方法がわかりません。デフォルトでは、フォルダに今日ではなく古いタイムスタンプを含むファイルがあるかどうかを確認する必要があります。既存のファイルがある場合は削除します。

答え1

find . -type f -mtime +0 -exec rm -f {} +

または

find . -type f ! -mtime -1 -exec rm -f {} +

内容が最後に変更されてから24時間以上経過した一般ファイルは削除されます(-mtime +0つまり、その内容年齢日単位で測定されます(整数で半減し、日は24時間または86400 Unix epoch秒)。厳密にゼロより大きい)。

一部のfind実装には-delete代わりに使用できる述語があり、-exec rm -f {} +より安全で効率的です。

GNUを使用すると、今日00:00:00より前に最後に変更されたファイルの述語をfind追加できます-daystart。これには、24時間経っても昨日最後に変更されたファイルが含まれます。

一部のfind実装では、次のこともできます。

find . ! -newermt 00:00:00 -delete

今日00:00:00より前(または正確に)最後に変更されたファイルを削除します。

答え2

デフォルトでは、または次のようにzshを使用してくださいzsh -c "..."

rm -f /path/to/folder/*(.m+0)     # for that directory only

rm -f /path/to/folder/**/*(.m+0)  # recursively

角かっこ(...)作成zsh "グローバル修飾子"。内部では、ドットは.通常のファイルを指定し(findに似ています-type fm+0、ファイルの変更時間は0日前より大きくなければなりません(1日に切り捨てられます)。 23時間は0日、25時間は1日です。

「隠し」ファイル(ドットで始まる)検索/一致のデフォルトの動作とより密接に一致させるには、find大文字のD修飾子を追加します。

rm -f /path/to/folder/*(D.m+0)     # for that directory only

rm -f /path/to/folder/**/*(D.m+0)  # recursively

答え3

-notfindにはor引数があり、!後者を無効にして-deleteファイルを削除します。

find . ! -mtime -1 -type f -delete

-notPOSIX規格ではありません。

答え4

日中に古いファイルの量が多い場合は、徹底を確保するために次のことを行います。 1日にファイル数を取得します。

$ find . -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c
# Output:
  42315 2020-09-29
  42315 2020-09-30
  42315 2020-10-01
  42315 2020-10-02
  42315 2020-10-03
  42315 2020-10-04
  42315 2020-10-05
   2275 2020-10-06

そして今日より古いすべてのファイルを削除します。

$ find . -mindepth 1 -type f -mtime +0 | xargs /bin/rm -f
## Now to check the count again.
$ find . -type f -printf '%TY-%Tm-%Td\n' | sort | uniq -c
   2275 2020-10-06

理由はよくわかりませんが、使用に-exec rm時間がかかり、配管がxargs速いことがわかりました。

関連情報