UNIXで特定の日より古いファイルを見つけて削除する方法は?


38

ログ用のフォルダーが1つあり、その中に7つのフォルダーがあります。これらの7つのフォルダーにもサブフォルダーがあり、これらのサブフォルダーにもサブフォルダーがあります。フォルダー構造を変更せずに、サブフォルダーを含むすべてのフォルダー内の15日より古いすべてのファイルを削除したい、つまりファイルのみを削除したい。

mahesh@inl00720:/var/dtpdev/tmp/ > ls
A1  A2  A3  A4  A5  A6  A7

mahesh@inl00720:/var/dtpdev/tmp/A1/ > ls
B1 B2 B3 B4 file1.txt file2.csv

回答:


54

と言うことから始めることができますfind /var/dtpdev/tmp/ -type f -mtime +15。これにより、15日より古いすべてのファイルが検索され、名前が出力されます。オプション-printで、コマンドの最後に指定できますが、それがデフォルトのアクションです。最初に上記のコマンドを実行して、選択されているファイルを確認することをお勧めします。

findコマンドが削除するファイルをリストしていることを確認したら(他のファイルは削除しない)、ファイルを削除するための「アクション」を追加できます。これを行う典型的なアクションは次のとおりです。

  1. -exec rm -f {} \;(または同等に、-exec rm -f {} ';'
    これはrm -f各ファイルで実行されます。例えば、

    rm -f /var/dtpdev/tmp/A1/B1; rm -f /var/dtpdev/tmp/A1/B2; rm -f /var/dtpdev/tmp/A1/B3; …
    
  2. -exec rm -f {} +
    これはrm -f一度に多くのファイルで実行されます。例えば、

    rm -f /var/dtpdev/tmp/A1/B1 /var/dtpdev/tmp/A1/B2 /var/dtpdev/tmp/A1/B3 …
    

    そのため、オプション1よりも若干高速になる場合があります(rm -f数千のファイルがある場合は、数回実行する必要があります)。

  3. -delete
    これによりfind、を実行せずにファイルを削除するように指示されますrm。これは-exec亜種よりも非常に高速ですが、すべてのシステムで機能するわけではありません。

したがって、オプション2を使用する場合、コマンド全体は次のようになります。

find /var/dtpdev/tmp/ -type f -mtime +15 -exec rm -f {} +

-deleteを使用する方が簡単です(構文と削除を行うために生成される子プロセスはありません)が、すべてのシステムで機能しない場合があります。rm -f {} +が最適です。1つのコマンドラインでは大きすぎるファイルがある場合、バッチでファイルを削除します。rm -f {} ';' 1つのコマンドラインに対して大きすぎるファイルがある場合、コマンドが長すぎるエラーを返します。
gaoithe

-1

または、ループでそれを行います:

for x in $(find /var/dtpdev/tmp/ -type f -mtime +15); do rm "$x"; done

これは、スペースを含むファイルでは機能しません。
Dravスローン

代わりに、スペースを含むファイルを処理するwhileループを使用できます。/ var / dtpdev / tmp / -type f -mtime +15 | xを読みながら rm "$ x"; 完了
デビッドオクウィー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.