新起源時間の比較に問題があります。何が間違っているのかわかりません。私の使命は、特定の日付範囲外のファイルを識別して処理することです。
この場合はクリーンアップスクリプトです。検索にはいくつかのパラメータが必要で、日付を確認してください。私の日付は次のとおりです。
ファイルを削除できる最も早い日付 - >date -d "-30days" +"%s"
ファイルを圧縮できる最も早い日付 - >date -d "-14days" +"%s"
ファイルの最後の修正時刻を取得する:stat -c "%y" "/path/to/file"
最後の修正時刻のエポックを取得します。date -d "<from the obtained time from stat>" +"%s"
数学は次のとおりです。
if (( FILE_TIMESTAMP >= EARLIEST_DELETE_DATE ))
then
delete file;
elif (( FILE_TIMESTAMP >= EARLIEST_COMPRESS_DATE ))
then
compress file;
else
echo "file skipped as it wasnt in teh date ranges";
fi
(上記のコードを編集:ここで<= EARLIEST_DELETE_DATEの確認を削除しました。)
最初の if 文は期待どおりに動作します。 2番目は途中で動作します。タイムスタンプが圧縮された日付より大きいことを認識していますが、削除された日付より小さい日付のチェックは、コードの対応する部分が実行されないためにfalseを返すようです。
私は計算を間違っているのでしょうか、それとも変数が間違っていますか?
また、私の投稿がゴミだということも知っています。コミュニティへの負担を軽減するため、今後はアカウントを削除します。
いくつかのアップデート:
私のデバッグログ出力を見ると、次のようになります。
[Time: ][Thread: 883837][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:99] [Method: manageFileLifecycle.sh] - FILE_DATESTAMP -> 2023-05-07 03:20:29.000000000 -0400 [Time: ][Thread: 883837][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:100] [Method: manageFileLifecycle.sh] - FILE_TIMESTAMP -> 1683444029
表示されたファイルは6ヶ月より古いですが、> = delete句によってトリガーされませんでした。何が間違っているのかわかりません。
@markp-fusoの場合:
declare -- FILE_TIMESTAMP="1688178017"
declare -i EARLIEST_DELETE_DATE="1697037095"
declare -i EARLIEST_COMPRESS_DATE="1698419495"
FILE_TO_PROCESS -> /opt/cws/log/S93206319.log, FILE_DATESTAMP -> 2023-06-30 22:20:17.000000000 -0400 FILE_TIMESTAMP -> 1688178017, EARLIEST_DELETE_DATE -> 1697037095, EARLIEST_COMPRESS_DATE -> 1698419495
ログ出力ではファイルをスキップしてはいけませんが、スキップするのがわかります。
そして申し訳ありません。スクリプト全体は会社の資産なので共有できません =(
追加情報:
特定のファイル抽出は機能しません。
declare -- FILE_TIMESTAMP="1679107439"
declare -i EARLIEST_DELETE_DATE="1697040305"
declare -i EARLIEST_COMPRESS_DATE="1698422705"
FILE_TO_PROCESS -> /opt/cws/log/S93382366.log, FILE_DATESTAMP -> 2023-03-17 22:43:59.000000000 -0400 FILE_TIMESTAMP -> 1679107439, EARLIEST_DELETE_DATE -> 1697040305, EARLIEST_COMPRESS_DATE -> 1698422705
file skipped as it wasnt in teh date ranges
そして
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:93] [Method: manageFileLifecycle.sh] - processRequestedFile -> enter
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:94] [Method: manageFileLifecycle.sh] - Provided arguments: /opt/cws/log/S93382366.log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:95] [Method: manageFileLifecycle.sh] - ERROR_COUNT -> 0
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:96] [Method: manageFileLifecycle.sh] - FILE_TO_PROCESS -> /opt/cws/log/S93382366.log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:97] [Method: manageFileLifecycle.sh] - FILE_CORE_NAME -> S93382366
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:98] [Method: manageFileLifecycle.sh] - FILE_CORE_EXT -> log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:99] [Method: manageFileLifecycle.sh] - FILE_DATESTAMP -> 2023-03-17 22:43:59.000000000 -0400
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:100] [Method: manageFileLifecycle.sh] - FILE_TIMESTAMP -> 1679107439
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:107] [Method: manageFileLifecycle.sh] - FILE_CORE_EXT and FILE_CORE_NAME do not match - executing with a file extension
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:139] [Method: manageFileLifecycle.sh] - File has extension log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:298] [Method: manageFileLifecycle.sh] - RETURN_CODE -> 0
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:299] [Method: manageFileLifecycle.sh] - processRequestedFile -> exit
少なくとも削除句がファイルに影響を与えるようです。
組版の出力:
declare -- FILE_TIMESTAMP="1703308529"
declare -i EARLIEST_DELETE_DATE="1697040305"
declare -i EARLIEST_COMPRESS_DATE="1698422705"
FILE_TO_PROCESS -> /opt/cws/log/S20504215.log, FILE_DATESTAMP -> 2023-12-23 00:15:29.000000000 -0500 FILE_TIMESTAMP -> 1703308529, EARLIEST_DELETE_DATE -> 1697040305, EARLIEST_COMPRESS_DATE -> 1698422705
デバッグログの出力:
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:93] [Method: manageFileLifecycle.sh] - processRequestedFile -> enter
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:94] [Method: manageFileLifecycle.sh] - Provided arguments: /opt/cws/log/S20504215.log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:95] [Method: manageFileLifecycle.sh] - ERROR_COUNT -> 0
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:96] [Method: manageFileLifecycle.sh] - FILE_TO_PROCESS -> /opt/cws/log/S20504215.log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:97] [Method: manageFileLifecycle.sh] - FILE_CORE_NAME -> S20504215
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:98] [Method: manageFileLifecycle.sh] - FILE_CORE_EXT -> log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:99] [Method: manageFileLifecycle.sh] - FILE_DATESTAMP -> 2023-12-23 00:15:29.000000000 -0500
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:100] [Method: manageFileLifecycle.sh] - FILE_TIMESTAMP -> 1703308529
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:107] [Method: manageFileLifecycle.sh] - FILE_CORE_EXT and FILE_CORE_NAME do not match - executing with a file extension
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:139] [Method: manageFileLifecycle.sh] - File has extension log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:143] [Method: manageFileLifecycle.sh] - File timestamp is greater than or equal to the delete date. File -> /opt/cws/log/S20504215.log, Timestamp -> 1703308529, EARLIEST_DELETE_DATE -> 1697035331
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:148] [Method: manageFileLifecycle.sh] - Deleting file /opt/cws/log/S20504215.log as it falls after the earliest delete date range.
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:149] [Method: manageFileLifecycle.sh] - EXEC: deleteRequestedFile /opt/cws/log/S20504215.log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: deleteRequestedFile:462] [Method: manageFileLifecycle.sh] - deleteRequestedFile -> enter
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: deleteRequestedFile:463] [Method: manageFileLifecycle.sh] - Provided arguments: /opt/cws/log/S20504215.log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: deleteRequestedFile:464] [Method: manageFileLifecycle.sh] - REMOVABLE_FILE -> /opt/cws/log/S20504215.log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: deleteRequestedFile:465] [Method: manageFileLifecycle.sh] - REMOVABLE_FILE_NAME -> S20504215.log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: deleteRequestedFile:466] [Method: manageFileLifecycle.sh] - REMOVABLE_FILE_PATH -> /opt/cws/log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: deleteRequestedFile:470] [Method: manageFileLifecycle.sh] - Checking if /opt/cws/log exists...
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: deleteRequestedFile:516] [Method: manageFileLifecycle.sh] - Returning to previous directory /opt/cws/log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: deleteRequestedFile:520] [Method: manageFileLifecycle.sh] - Previous directory: /opt/cws/log, New working directory: /opt/cws/log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: deleteRequestedFile:530] [Method: manageFileLifecycle.sh] - RETURN_CODE -> 1
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: deleteRequestedFile:531] [Method: manageFileLifecycle.sh] - deleteRequestedFile -> exit
目標は、現在の日付から30日より古いすべてのファイルを削除し、現在の日付から14日以上30日未満のファイルを圧縮することです(この項目は削除範囲に属します)。 14日残りました。
答え1
あなたのロジックが間違っています。あなたはそれを治療していますか?タイムスタンプまるで彼らがそうしたように年齢。しなければならない:
if (( FILE_TIMESTAMP < EARLIEST_DELETE_DATE ))
then
delete file
elif (( FILE_TIMESTAMP < EARLIEST_COMPRESS_DATE ))
then
compress file
else
echo "file skipped as it wasn't in the date ranges"
fi
ポータブルタスクには、次のコマンドを使用することもできますfind
。
find -- "$file" -prune -mtime +29 -exec rm -f -- {} + -o \
-mtime +13 -exec gzip -- {} + -o \
-exec echo Skipping {} +
ただし、--
(or、、)で始まる値についてはこの方法が失敗することに注意してください。呼び出されるファイルにも問題があります(ファイルを標準入力として扱います。GNUでも同様です)。$file
-
(
)
!
gzip
-
stat
-mtime +29
これは整数に丸められ、29日より大きいファイル、つまり30日以上経過したファイルの場合に当てはまります。
BSDの場合は、find
次の手順を実行して問題/混乱を解決することができます。
find -f "$file" -prune -mtime +30d -exec rm -f -- {} + -o \
-mtime +14d -exec gzip -- {} + -o \
-exec echo Skipping {} +
(d
サフィックスを参照)。
最新バージョンのGNUを使用しても、find
次のことができます。
find -files0-from <(printf '%s\0' "$file") -prune \
! -newermt '30 days ago' -exec rm -f -- {} + -o \
! -newermt '14 days ago' -exec gzip -- {} + -o \
-printf 'Skipping %p\n'
するいいえユーザーは-delete
ヒントに従い、-exec rm -f {} +
コマンドの成功/失敗がロジックに使用されるため、これらのコマンドの最初の2秒間は置換を使用しません。-delete
-depth
-exec ... ';'
-exec ... +
-exec
find
これらのコマンドはすべて複数のファイルを処理できます(BSDのfind
場合-f "$file1" -f "$file2"...
)。
答え2
問題が終わったら、次の規則があります。
- 現在の日付から30日を過ぎたすべてのファイルを削除します。
- 現在の日付から14日以上30日以下のすべてのファイルを圧縮します(この項目は削除されます)。
- 14日が経過していないすべてのファイルは保持されます。
最新のアップデートでは、2つのエポック値のセットを取得しました。
filename: /opt/cws/log/S93382366.log
FILE_TIMESTAMP="1679107439" # Fri Mar 17 21:43:59 CDT 2023
EARLIEST_DELETE_DATE="1697040305" # Wed Oct 11 11:05:05 CDT 2023
EARLIEST_COMPRESS_DATE="1698422705" # Fri Oct 27 11:05:05 CDT 2023
code result: ISN'T working (assuming this means code generates "file skipped as it wasnt in the date ranges")
expected result: delete file (more than 30 days old; NOTE: compression should have occurred a long time ago)
-----------
filename: /opt/cws/log/S20504215.log
FILE_TIMESTAMP="1703308529" # Fri Dec 22 23:15:29 CST 2023
EARLIEST_DELETE_DATE="1697040305" # Wed Oct 11 11:05:05 CDT 2023
EARLIEST_COMPRESS_DATE="1698422705" # Fri Oct 27 11:05:05 CDT 2023
code result: delete file
expected result: file skipped as it wasn't in the date ranges (less than 14 days old; actually, file has timestamp that is 42 days in the future when today = Nov 10 2023)
コードの主な問題:
- 「古い」新起源の日付は実際に少ない「最近」時代の日付より...
- コードは次の期間テストする必要があります。少ない希望のしきい値を超える
現在のコードを修正して、必要な3つのルールを実装してください。
if (( FILE_TIMESTAMP < EARLIEST_DELETE_DATE ))
then
echo "delete file"
elif (( FILE_TIMESTAMP < EARLIEST_COMPRESS_DATE ))
then
echo "compress file"
else
echo "file skipped as it wasn't in the date ranges";
fi
これを2つのサンプルファイル/エポックグループに適用すると、次のような結果が得られます。
filename: /opt/cws/log/S93382366.log
FILE_TIMESTAMP="1679107439" # Fri Mar 17 21:43:59 CDT 2023
EARLIEST_DELETE_DATE="1697040305" # Wed Oct 11 11:05:05 CDT 2023
EARLIEST_COMPRESS_DATE="1698422705" # Fri Oct 27 11:05:05 CDT 2023
code result: delete file
-----------
filename: /opt/cws/log/S20504215.log
FILE_TIMESTAMP="1703308529" # Fri Dec 22 23:15:29 CST 2023
EARLIEST_DELETE_DATE="1697040305" # Wed Oct 11 11:05:05 CDT 2023
EARLIEST_COMPRESS_DATE="1698422705" # Fri Oct 27 11:05:05 CDT 2023
code result: file skipped as it wasn't in the date ranges