X時間以上経過したファイルを削除する方法


191

古いファイルを削除する必要があるbashスクリプトを書いています。

それは現在使用して実装されています:

find $LOCATION -name $REQUIRED_FILES -type f -mtime +1 -delete

これにより、1日以上経過したファイルが削除されます。

ただし、1時間よりも細かい解像度が必要な場合、たとえば6時間経過した場合はどうなりますか?findと-mtimeを使用するように、それを行うためのきれいな方法はありますか?

回答:


303

あなたはないfind持っている-mminオプションは?これにより、最後の変更以降の分数をテストできます。

find $LOCATION -name $REQUIRED_FILES -type f -mmin +360 -delete

または多分tmpwatch同じ仕事をするために使用することを見てください。phjrもtmpreaperコメントで推奨されています。


2
--mmin + Xを使用すると、検索ですべてのファイルが返されます。これを最初にチェックしないのは私のせいですが、このコマンドはホームディレクトリのほとんどを削除しました。私にとって、-mmin -Xは正しい引数です。
ブランドン2013年

tmpreapertmpwatchのフォークです。より安全で、ディストリビューションにはdebianパッケージとして存在します。find -deleteと比較した場合の利点:tmpreaperはシンボリックリンク、ソケット、fifo、または特殊ファイルを削除しません
Nadir

$ REQUIRED_FILESは引用符(二重引用符)で囲む必要があることを指摘します。すべての.txtファイルまたは「temp-」のようなパターンで始まるファイルには、「.txt」のようなパターンを使用して、tempで名前が付けられたすべてのファイルを削除できます。 -
achasinh

@PaulDixonはどのようにこれを修正する$LOCATIONと、$REQUIRED_FILES両方のような複数の値持つことができますdir1 dir2とは*.txt *.tmp
Enissay

@Enissay $ LOCATIONは単一のディレクトリです。参照-複数の拡張子については、おそらく-regexとパターンを使用したいと思いますstackoverflow.com/questions/5249779/...
ポール・ディクソン

9

このトリックには、1時間前にファイルを作成し、-newer file引数を使用します。

(またはtouch -t、そのようなファイルを作成するために使用します)。


1
-oldスイッチはありません(少なくとも私のfindコマンドにはあります)。これが必要です。-newerは役に立ちません。
iconoclast

-mminを使用できないマシンで動作する1時間前のファイルを生成するタッチコマンドを指定できますか?(Linuxを使用している場合は-mminを使用できますが、使用できない場合は、日付や他のコマンドも比較的安価です。)
iconoclast

2
@iconoclast 常に1時間前のtouch -t $(date -d '-1 hour' +%Y%m%d%H%M.00) testファイルtestを作成します。
rovr138

4

これは私のために働いたアプローチです(そして私はそれが上記で使用されているのを見ません)

$ find /path/to/the/folder -name *.* -mmin +59 -delete > /dev/null

フォルダーを残したまま、59分より古いすべてのファイルを削除します。


単一引用符を使用する'*.*'か、シェルがそれfindを解決するためのワイルドカードとして保持するのではなく、実際のファイル名に展開します。これによりfind、サブディレクトリに対するの再帰的な操作が中断されます。
MestreLion

また、その心に留めておく-name '*.*'などの拡張子を持っていないファイルの削除、しませんREADMEMakefileなど、
MestreLion

1

SunOS 5.10の場合

 Example 6 Selecting a File Using 24-hour Mode


 The descriptions of -atime, -ctime, and -mtime use the  ter-
 minology n ``24-hour periods''. For example, a file accessed
 at 23:59 is selected by:


   example% find . -atime -1 -print




 at 00:01 the next day (less than 24 hours  later,  not  more
 than one day ago). The midnight boundary between days has no
 effect on the 24-hour calculation.


0

お使いのバージョンの「find」に「-mmin」がない場合、「-mtime -0.041667」は「過去1時間以内」にかなり近くなるため、次のように使用します。

-mtime +(X * 0.041667)

したがって、Xが6時間を意味する場合、次のようになります。

find . -mtime +0.25 -ls

24時間* 0.25 = 6時間なので機能します


この古いUNIXには-mminがないため、希望に満ちていましたが、悲しいことに、この古いUNIXもmtimeの小数値が好きではないので、役に立ちません。find:-mtimeの引数は、-2147483647から2147483647
kbulgrien

0

@iconoclastが別の回答に対するコメントで疑問に思っていた方法を実行するためにできることは、次のとおりです。

ユーザーまたはの/etc/crontabファイルを作成するにはcrontabを使用します/tmp/hour

# m h dom mon dow user  command
0 * * * * root /usr/bin/touch /tmp/hour > /dev/null 2>&1

次に、これを使用してコマンドを実行します。

find /tmp/ -daystart -maxdepth 1 -not -newer /tmp/hour -type f -name "for_one_hour_files*" -exec do_something {} \;

*/1毎時はあなたのcrontabで冗長です。時間フィールドに*を入れるのと同じです。
colm.anseo 2017年


0

1つのは場合はfind持っていない-mminと1もにこだわっている場合findのみの値の整数受け入れること-mtime、そして全て必ずしも1が「より古い」は「より新しくない」と類似していることを考えれば失われることはありません。

カットオフタイムのmtimeを持つファイルを作成できた場合はfind、参照ファイルより「新しくない」ファイルを見つけるように要求できます。

適切なタイムスタンプが付いたファイルを作成するのは少し複雑です。適切なシステムがない場合は、findおそらく以下のdateようなことを実行できるコマンドが実行可能ではないためです date +%Y%m%d%H%M%S -d "6 hours ago"

幸いなことに、より扱いにくい方法ではありますが、これを管理できる他の古いツール。

6時間は21600秒であると考えてください。有用な形式で6時間前の時刻を検索します。

$ date && perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'
> Thu Apr 16 04:50:57 CDT 2020
202004152250.57

perlステートメントは有用な日付を生成しましたが、より適切に使用する必要があります。

$ date && touch -t `perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", \
  $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'` ref_file && ls -l ref_file
Thu Apr 16 04:53:54 CDT 2020
-rw-rw-rw-   1 root     sys            0 Apr 15 22:53 ref_file

現在、この古いUNIXのソリューションは次のようなものです。

$ find . -type f ! -newer ref_file -a ! -name ref_file -exec rm -f "{}" \;

また、参照ファイルをクリーンアップすることもお勧めします...

$ rm -f ref_file
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.