サブディレクトリがあるx日より古いファイルを削除するBashスクリプト


37

x日より古いファイルを大量に削除しようとしています。

今、私はそれを行うスクリプトを持っています

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

ただし、これによりサブディレクトリも削除されます。たくさんのフォルダーがありますが、それらを保持し、そのフォルダー内の10日より古いファイルを削除したいと思います。

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

回答:


50

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

findtypeたとえば、ファイルのみを選択するオプションを受け入れます。

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

アウトのままに-delete、それは削除したいかを示すために、そしてあなたがそれを確認した後、先に行くと、完全なコマンドを実行します。

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


追加オプション

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

いくつかの発言

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

  • また、/path/to/files*紛らわしいです。/path/to/files/ワイルドカードが複数のファイル名とフォルダ名に展開されることを意味しているのですか、それとも期待していますか?

  • 入れ{}すなわち、一重引用符で'{}'、我々はバックスラッシュでセミコロンを守るだけのように、シェルによって解釈される置換ファイル/ディレクトリ名を避けるために。


/ path / to / files /内には多くのフォルダーがあります。実際には、これらのフォルダーのそれぞれに対してmtime +10 -exec rmを実行しますが、フォルダー自体を保持します。 10日よりも古いファイルで、すべてのフォルダーを保持します。私はその初心者についてすみません申し訳ありません:)
JoyIan Yee-Hernandez

さて、あなたはそこに行きます:)ただやってfind /path/to/files* -type f -mtime +10、それが何を出力するかを見てください。
slhck

うん、疑わしいときは、やらないで、-exec最初に見つけたものを見てください。
ロブ

2
@ JoyIanYee-Hernandezまた、への-delete引数を使用してfind、すべてのファイルとフォルダーを削除できます。後者は空の場合のみです。-depthつまり、深さ優先検索を意味します。
ダニエルベック

1
@Kreker次に、追加-mindepth 1して親ディレクトリを除外する必要があります。
slhck

5

前の回答(両方とも+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し、より高速に作業する必要がある場合は、find ... | xargs ... rmUNIXのイディオムを確認してください。


4
最後の2つの例はまったく同じだと思うので、修正したいかもしれません!
-slhck

1

これはfindコマンドで簡単に行えます

$ find -type f

結果をファイルタイプに制限します


1

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

ついにtmpreaperにつまずき、これまでのところ私たちにとっては非常にうまく機能しています。

tmpreaper -t 5d ~/Downloads


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

元のソースリンク

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


0

コマンドを高速化するには、'+'代わりに\;

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

これはrm、ファイルが見つかるたびにではなく、最後に1回だけ実行されます。
rmコマンドラインの長さの制限のために本当にたくさんのファイルがある場合、数回実行されるかもしれませんが、これはまだ使用とほぼ同じくらい速いです-delete


0

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

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

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

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

findの前と5の後の最後に `を使用します。

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