n日より古いディレクトリを削除するシェルスクリプト


165

次の名前のディレクトリがあります:

2012-12-12
2012-10-12
2012-08-08

bashシェルスクリプトで10日より古いディレクトリを削除するにはどうすればよいですか?


1
彼らは実際の作成/変更時間に何らかの関係を示していますか?find名前を見なくてもそれができるので...
Wrikken

彼らにも作成/変更の時間が必要です
bobsr

4
「より古い」とはどういう意味ですか?ディレクトリが作成された時刻、その内容が最後に変更された時刻、または何か他のことを参照していますか?以下の回答のいくつかに注意してください。ctimeiノード変更時間です。ディレクトリの場合、ディレクトリにファイルが追加または削除されると変更されます。
ajk 2014

回答:


390

これはあなたのために再帰的に行います:

find /path/to/base/dir/* -type d -ctime +10 -exec rm -rf {} \;

説明:

  • find:ファイル/ディレクトリ/リンクなどを見つけるためのUNIXコマンド
  • /path/to/base/dir:検索を開始するディレクトリ。
  • -type d:ディレクトリのみを検索
  • -ctime +10:修正時間が10日より古いもののみを考慮
  • -exec ... \;:見つかったそのような結果ごとに、次のコマンドを実行します ...
  • rm -rf {}:再帰的にディレクトリを強制的に削除します。{}検索結果は、前の部分から代入されますどこの部分です。

または、次を使用します。

find /path/to/base/dir/* -type d -ctime +10 | xargs rm -rf

これは次のようになるため、もう少し効率的です。

rm -rf dir1 dir2 dir3 ...

とは対照的に:

rm -rf dir1; rm -rf dir2; rm -rf dir3; ...

以下のような-exec方法。


最近のバージョンではfind、あなたは置き換えることができ;+、それが相当行いますxargs各execシステムコールに収まるように多くのファイルとして渡して、あなたのために電話を:

find . -type d -ctime +10 -exec rm -rf {} +

12
-mtime許可の変更ではなくコンテンツの変更をチェックするため、私にとってはより良かったです。
2013年

7
私は、これは、ベースディレクトリ自体を削除すると思います
あるいは、ギャル

3
@OrGalあなたは絶対的に正しいです。これを防ぐには、次を使用しますfind /path/to/base/dir/*
zloynemec 2015

11
-maxdepth 1を使用して、ディレクトリの内容を無視できます
Sam

7
削除するフォルダが多すぎる場合は、より効率的な方法で逆効果が得られます:stackoverflow.com/questions/11289551/…。同じ理由で、ベースフォルダーの削除を回避するには、-mindepth 1(ではなく/path/to/folder/*)を使用することをお勧めします。
Ohad Schneider

41

/path/to/baseたとえば、以下のすべてのサブディレクトリを削除する場合

/path/to/base/dir1
/path/to/base/dir2
/path/to/base/dir3

しかし、ルートを削除したくない場合は、オプション/path/to/baseを追加する必要が-mindepth 1あり-maxdepth 1ます。オプションは、以下のサブディレクトリにのみアクセスします/path/to/base

-mindepth 1ルート/path/to/baseを一致から除外します。

-maxdepth 1ONLYすぐ下のサブディレクトリに一致する/path/to/baseような/path/to/base/dir1/path/to/base/dir2そして/path/to/base/dir3、それは再帰的にこれらのサブディレクトリの一覧を表示しません。したがって、これらのサンプルサブディレクトリはリストされません。

/path/to/base/dir1/dir1
/path/to/base/dir2/dir1
/path/to/base/dir3/dir1

など。

したがって、/path/to/base10日より古いすべてのサブディレクトリを削除するには、

find /path/to/base -mindepth 1 -maxdepth 1 -type d -ctime +10 | xargs rm -rf

19

find-delete操作をサポートするので、

find /base/dir/* -ctime +10 -delete;

ファイルも10日以上古くなければならないという難点があると思います。試したことがないので、誰かがコメントで確認するかもしれません。

ここで最も投票されたソリューションは欠落している-maxdepth 0ためrm -rf、削除するとすべてのサブディレクトリが必要になります。それは意味をなさないので、私はお勧めします:

find /base/dir/* -maxdepth 0  -type d -ctime +10 -exec rm -rf {} \;

上記の-deleteソリューションは、dirが空でないと不平を言う-maxdepth 0ので使用しませんfind。代わりに、それは暗黙の-depthうちにボトムアップで削除されます。


-delete動作は確認できましたが、あなたが言ったように、空のディレクトリを削除するためにのみ使用できますrmdir
CTodea 2018年

3

上記のスクリプトと他のスクリプトを使用してこれを正しく行うのに苦労していました。特に、ファイルとフォルダーの名前に改行またはスペースが含まれている場合はそうでした。

ついにtmpreaperに出くわしましたが、これまでのところかなりうまくいきました。

tmpreaper -t 5d ~/Downloads


tmpreaper  --protect '*.c' -t 5h ~/my_prg

元のソースリンク

ディレクトリを再帰的にチェックしてリストするtestなどの機能があります。削除中にシンボリックリンク、ファイル、またはディレクトリ、および特定のパターンの保護モードを削除する機能


2

または

rm -rf `find /path/to/base/dir/* -type d -mtime +10`

更新された、より高速なバージョン:

find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f

2
これはコマンドラインの最大長を簡単に超える可能性があります。を参照してくださいxargs --show-limits
Michael Krupp

2
また、スペースまたはその他の特殊なシェル文字を含むファイル名がある場合も機能しません。
Martin Tournoij 2017年

@Carpetsmoker -print0/ -0は特殊なシェル文字を処理しませんか?
mpen 2017年

あなたは正しいxargsバージョンが@mpenますが、最初の行はしません。
マーティンTournoij
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.