web-dev-qa-db-ja.com

サブディレクトリを持つx日より古いファイルを削除するためのbashスクリプト

X日以上経過した大量のファイルを削除しようとしています。

今、私はそれをするためのスクリプトがあります

find /path/to/files* -mtime +10 -exec rm {} \; 

しかし、これでサブディレクトリも削除されます。たくさんのフォルダがありますが、それらを保管し、そのフォルダ内の10日以上経過したファイルを削除したいと思います。

これを行う方法はありますか?

36

結果をフィルタリングするためのtypeオプション

findは、ファイルのみを選択するためのtypeオプションを受け入れます。

find /path/to/files -type f -mtime +10 -delete

何を削除するのかを表示するには-deleteを省略し、確認したら先に進んでfullコマンドを実行します。

これはファイルでのみ実行され、ディレクトリでは実行されません。逆には-type dを使用して、引数に一致するディレクトリのみを一覧表示します。


追加オプション

将来必要になる可能性のあるオプションが他にもあるので、man findを読むことをお勧めします。たとえば、-maxdepthでは、見つかったアイテムを特定の深さに制限することしかできません。 -maxdepth 0はサブディレクトリに再帰しませんでした。

いくつかの所見

  • rmだけではフォルダを削除することはできないので、コマンドがどのようにフォルダを削除したのでしょうか。そのためにはrm -rが必要です。

  • また、/path/to/files*は紛らわしいです。 /path/to/files/を意味しましたか、それともワイルドカードを使用していくつかのファイル名およびフォルダ名に展開することを期待していましたか?

  • セミコロンをバックスラッシュで保護するのと同じように、置換されたファイル/ディレクトリ名がシェルによって解釈されないようにするため、{}を一重引用符で囲みます(つまり、'{}')。

50
slhck

前の回答と同じように(両方とも+1)、秘訣は-type f述語を使うことです。

-exec rm '{}'の代わりに-delete述語を使うこともできます。しかし、そうしないでください。 -exec rm '{}'を使って、あなたが最初に-exec echo rm '{}'をすることができる(そしてそうするべきです)これが本当にあなたが望むものであることを確かめるために。その後、echoを付けずにコマンドを再実行してください。

-deleteを使用するのはより速いです(各ファイルのための余分なfork()execve()がない)、しかしこれは-deleteが条件としても働くので危険です。

# delete *.tmp files
find . -type f -name '*.tmp' -delete

しかし、引数を交換するだけなら:

# delete ALL files
find . -type f -name '*.tmp' -delete

大量のファイルに対して高速に動作させるためにfindrmが必要な場合は、UNIXのfind ... | xargs ... rmを参照してください。

5
Michał Šrajer

あなたは簡単にfindコマンドでこれをすることができます

$ find -type f

結果がタイプファイルになるように制限します。

1
Bernhard

特にファイル名やフォルダ名に改行やスペースが含まれている場合は、上記のスクリプトや他のスクリプトを使用してこの問題を解決するのに苦労しました。

ついにtmpreaperに遭遇しました、そしてそれは今のところ私達のためにかなりよく働きました。

tmpreaper -t 5d ~/Downloads


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

元のソース リンク

Testのような機能があり、ディレクトリを再帰的にチェックして一覧表示します。削除中にシンボリックリンク、ファイルまたはディレクトリ、さらに特定のパターンの保護モードを削除する機能

1
user52573

コマンドを高速化するには、'+'の代わりに\;を使用してください。

find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'

ファイルが見つかるたびにではなく、最後に一度だけrmを実行します。
(コマンドラインの長さの制限のために本当にたくさんのファイルがある場合は、rmが数回実行される可能性がありますが、これはまだ-deleteを使用するのと同じくらい高速です)

0
olibre

rm -f find /path/to/files -type file -mtime -5

これにより、5日以内に変更されたファイルが削除されます。

rm -f find /path/to/files -type file -mtime +5

これにより、5日前に変更されたファイルが削除されます。

検索の前に、5の後に `を使用してください。

0
Nikhil Shinde