7日より古いファイルを自動削除する


17

私はLinuxの完全な初心者ですが、それを理解し始めています。セキュリティビデオファイルをバックアップするためにFTPサーバーを実行しているUbuntu Server 16.04があります。ファイルは次のようにフォルダに保存されます:/home/securityfolder1/home/securityfolder2/home/securityfolder3そしてそうで。

それぞれsecurityfolderNが異なるユーザーであることに注意してください。

ハードドライブを常にいっぱいにしたくないので、これらのフォルダーの7日以上前のファイルを毎日削除します。


/home通常、各ユーザーのサブフォルダーが含まれます。別のユーザーとしてバックアップを保存したくない場合(あまり良い考えではありません)、別の場所などを検討する必要があります/home/security/backup1
メレビウス

@Melebiusはあなたのコメントに感謝します、すべての/ securityfolderは異なるユーザーです、私はそれを言及するのを忘れました。
ジャッコヴァンデウェイガート

回答:


26

最初に、このコマンドは/home、名前が次で始まるサブディレクトリ内の7日より古いすべてのファイルを検索して削除しますsecurityuser

find /home/securityuser* -mtime +6 -type f -delete

24時間をカウントするため、必要では-mtime +6ありません。のセクションで説明したように(同じように機能します):+7-mtime-atimeman find-mtime

   -atime n
          File  was  last  accessed n*24 hours ago.  When find figures out
          how many 24-hour periods ago the file  was  last  accessed,  any
          fractional part is ignored, so to match -atime +1, a file has to
          have been accessed at least two days ago.

したがって、7日以上前に変更されたファイルを見つけるには、6日以上前に変更されたファイルを見つける必要があり-mtime +6ます。

次のステップは、このコマンドを1日に1回実行することです。それぞれsecurityuserNが異なるユーザーであるため(セットアップを再考する必要がある場合があり、すべてがより複雑になります)、これをrootとして実行する必要があります。だから、編集/etc/crontab

sudo nano /etc/crontab

そして、次の行を追加します。

@daily root find /home/securityuser* -mtime +6 -type f -delete

これにより、findコマンドが1日に1回実行され、ファイルが削除されます。


+1爪をもう少し深く運転し、メレビウスのOPへの提案を繰り返しfind '/home/securityuser/*' -mtime +6 -type f -deleteますが、(ユーザー作成のすべての適切で適切な変更を加えて)一般的にはfind '/home/securityuser*' -mtime +6 -type f -delete(パスにスラッシュがない)よりも良いアイデアかもしれません ...?
Cbhihe

@Cbhiheいいえ、ターゲットディレクトリが呼び出される/home/securityuserNので、スラッシュなしでは見つかりません。
テルドン

うん、それを見た。OPにはそうする理由があるかもしれませんが、Melebiusの最初のコメントの行に沿って、OP側(セキュリティビデオごとに個別のユーザーを作成するなど)の良い習慣とは考えていませんでした。なにか私のコメントが下手だったのであれば、あなたの良い完全な答えに対する批判ではありませんでした。
Cbhihe

1
+1私から。RHELでこれを実行していたときの1つの詳細に注意してください。ワイルドカードはパスで機能しませんでした。私は上にそれを入れていた-namefind /home/ -name 'securityuser*' -mtime +6 -type f -delete
ステリオスAdamantidis

1
@SteliosAdamantidisああすごい、私は完全にそれを見逃した!はい、引用したので元のバージョンは機能しません'securityuser*'。ワイルドカードは、ではなくシェルによって展開されるfind必要があるため、securityuser*(引用符なしで)展開される必要があります。更新された回答を参照してください。指摘してくれてありがとう、ステリオ、誰も気付かなかったなんて信じられない!Ti vlakas!
テルドン

4

私の知識に従って:

find次のようなコマンドを試してください:

find ./dirc/* -mtime +6 -type f -delete

./dirc/* : is your directory (Path)
-mtime +6 : modified more than 6 days ago (therefore, at least 7 days ago)
-type f : only files
-delete : no surprise. Remove it to test before like rm

ご回答ありがとうございます。./dirc/*は./home/securityfolder1/*を意味しますか、それとも間違っていますか?
ジャコヴァンデウェイガート

virtualboxで試してみたところfind /home/jacco/ -mtime +1 -type f -delete、うまくいくようです。これをどのように自動化できますか?
ジャコヴァンデウェイガート

1つのスクリプトファイルを作成し、起動プロセスでスクリプトファイルを実行するよりも機能する場合は、スクリプトを使用してこのコマンドを実行します。
モーリクパテル

私はここでスクリプトを作成する部分のスーパーヌーブのようです、これはファイル#!/bin/bashとその下のコードを意味しますか?または私は本当にここで本当に愚かですか?
ジャッコヴァンデウェイガート

2
@Melebiusいいえ、特にグロブ文字を含む場合、パスは引用符で囲まないでください。あなたは欲しいものをブロックすることがシェルによって展開されるようにして引用します。たとえば、試してみてくださいfind '/u*' -name local-name "foo*"グロブ文字を含む場合は、そのようなディレクティブを引用する必要があります。
テルドン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.