153

私はシェルスクリプトを初めて使用しますが、誰か助けてもらえますか?フォルダ内のスクリプトを現在の日付から10日まで削除したい。スクリプトは次のようになります。

2012.11.21.09_33_52.script
2012.11.21.09_33_56.script
2012.11.21.09_33_59.script

スクリプトはCrontabで10日ごとに実行されるため、現在の日付が必要です。

4

3 に答える 3

488

findこの種のタスクの一般的なツールです:

find ./my_dir -mtime +10 -type f -delete

説明

  • ./my_dirあなたのディレクトリ(あなた自身のものに置き換えてください)
  • -mtime +1010日以上
  • -type fファイルのみ
  • -delete当然のことです。コマンド全体を実行する前に、フィルターをテストするために削除してくださいfind

そして、./my_dir悪い驚きを避けるために存在することに注意してください!

于 2012-11-21T08:54:10.213 に答える
20

上記のシェルスクリプトをスパイスアップして古いファイルを削除するだけですが、ログと経過時間の計算が必要です

#!/bin/bash

path="/data/backuplog/"
timestamp=$(date +%Y%m%d_%H%M%S)    
filename=log_$timestamp.txt    
log=$path$filename
days=7

START_TIME=$(date +%s)

find $path -maxdepth 1 -name "*.txt"  -type f -mtime +$days  -print -delete >> $log

echo "Backup:: Script Start -- $(date +%Y%m%d_%H%M)" >> $log


... code for backup ...or any other operation .... >> $log


END_TIME=$(date +%s)

ELAPSED_TIME=$(( $END_TIME - $START_TIME ))


echo "Backup :: Script End -- $(date +%Y%m%d_%H%M)" >> $log
echo "Elapsed Time ::  $(date -d 00:00:$ELAPSED_TIME +%Hh:%Mm:%Ss) "  >> $log

コードはいくつかのことを追加します。

  • タイムスタンプで名前が付けられたログファイル
  • 指定されたログフォルダ
  • findは、ログフォルダでのみ*.txtファイルを検索します
  • タイプfは、ファイルのみを削除することを保証します
  • maxdepth 1は、サブフォルダーに入らないようにします
  • 7日より古いログファイルは削除されます(これがバックアップログ用であると想定)
  • 開始/終了時刻をメモします
  • バックアップ操作の経過時間を計算します。

:コードをテストするには、-print-deleteの代わりに-printを使用します。ただし、パスを注意深く確認してください。

:サーバーの時刻がdateを介して正しく設定されていることを確認してください-timezone/ntpを正しく設定してください。さらに、「statfilename」でファイル時間を確認します

:mtimeは、日数のコンテキストでファイルのタイムスタンプを取得する場合、すべての小数部(2日(+2日)より古い場合は実際には3日を意味します)を破棄するため、mtimeをmminに置き換えることができます。

-mtime +$days  --->  -mmin  +$((60*24*$days))
于 2013-07-26T11:57:07.283 に答える
9

ファイルデータを介して作業する余裕がある場合は、次のことができます。

find -mmin +14400 -delete
于 2012-11-21T08:50:18.350 に答える