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 f
)m+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
-not
findにはor引数があり、!
後者を無効にして-delete
ファイルを削除します。
find . ! -mtime -1 -type f -delete
-not
POSIX規格ではありません。
答え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
速いことがわかりました。